summaryrefslogtreecommitdiff
path: root/libpanto-go/panto.go
diff options
context:
space:
mode:
authort <t@tjp.lol>2026-06-11 13:25:15 -0600
committert <t@tjp.lol>2026-06-11 13:26:12 -0600
commit3dcbf15bdb90e4c90e7225b82945a6862a7a063f (patch)
tree86de1b9853cd1a0506637918d71a64483488321d /libpanto-go/panto.go
parent6d725a9e35c3086f61cb6579d2840f5a09be450a (diff)
some go bindings fixes and an example app
Diffstat (limited to 'libpanto-go/panto.go')
-rw-r--r--libpanto-go/panto.go41
1 files changed, 28 insertions, 13 deletions
diff --git a/libpanto-go/panto.go b/libpanto-go/panto.go
index 786ff1c..5644b61 100644
--- a/libpanto-go/panto.go
+++ b/libpanto-go/panto.go
@@ -202,7 +202,12 @@ type (
)
type (
- Agent struct{ ptr *C.PantoAgent }
+ Agent struct {
+ ptr *C.PantoAgent
+ retainedSession *Session
+ retainedConv *Conversation
+ retainedStoreCloser func()
+ }
Stream struct {
ptr *C.PantoStream
err error
@@ -564,16 +569,7 @@ func (b ContentBlock) Snapshot() OwnedContentBlock {
}
func NewAgent(cfg Config) (*Agent, error) {
- st, err := NewNullStore()
- if err != nil {
- return nil, err
- }
- sess, err := CreateSession(st)
- st.Close()
- if err != nil {
- return nil, err
- }
- return NewAgentWithSession(cfg, sess, nil)
+ return NewAgentWithSession(cfg, nil, nil)
}
func NewAgentWithSession(cfg Config, session *Session, conv *Conversation) (*Agent, error) {
@@ -582,6 +578,11 @@ func NewAgentWithSession(cfg Config, session *Session, conv *Conversation) (*Age
return nil, err
}
defer strings.free()
+ var csession *C.PantoSession
+ if session != nil {
+ csession = session.ptr
+ runtime.SetFinalizer(session, nil)
+ }
var cconv *C.PantoConversation
if conv != nil {
cconv = conv.ptr
@@ -589,10 +590,10 @@ func NewAgentWithSession(cfg Config, session *Session, conv *Conversation) (*Age
runtime.SetFinalizer(conv, nil)
}
var out *C.PantoAgent
- if C.panto_agent_create(&ccfg, session.ptr, cconv, &out) != C.PANTO_OK {
+ if C.panto_agent_create(&ccfg, csession, cconv, &out) != C.PANTO_OK {
return nil, lastError()
}
- a := &Agent{out}
+ a := &Agent{ptr: out, retainedSession: session, retainedConv: conv}
runtime.SetFinalizer(a, (*Agent).Close)
return a, nil
}
@@ -602,6 +603,20 @@ func (a *Agent) Close() {
C.panto_agent_destroy(a.ptr)
a.ptr = nil
}
+ if a != nil {
+ if a.retainedSession != nil {
+ a.retainedSession.ptr = nil
+ a.retainedSession = nil
+ }
+ if a.retainedConv != nil {
+ a.retainedConv.ptr = nil
+ a.retainedConv = nil
+ }
+ if a.retainedStoreCloser != nil {
+ a.retainedStoreCloser()
+ a.retainedStoreCloser = nil
+ }
+ }
}
func (a *Agent) SessionID() string { return goSlice(C.panto_agent_session_id(a.ptr)) }
func (a *Agent) Conversation() *Conversation {