| 1 | package main |
| 2 | |
| 3 | import ( |
| 4 | "fmt" |
| 5 | "strings" |
| 6 | ) |
| 7 | |
| 8 | func (a *App) ResolveRemoteTabPromptExact(target RemotePromptTarget, answer PromptAnswerView) error { |
| 9 | a.remoteTabMu.Lock() |
| 10 | tab := a.remoteTabs[target.TabID] |
| 11 | supported := tab != nil && tab.capabilities[serveCapabilityInteractionTargetV1] |
| 12 | current := tab != nil && tab.ref.HostID == target.HostID && tab.session.sessionID == target.SessionID && tab.gen == target.SessionGeneration |
| 13 | a.remoteTabMu.Unlock() |
| 14 | if !supported { |
| 15 | return fmt.Errorf("this remote Reasonix Serve does not support %s; upgrade it to answer this card safely", serveCapabilityInteractionTargetV1) |
| 16 | } |
| 17 | if !current { |
| 18 | return fmt.Errorf("remote prompt session binding is stale") |
| 19 | } |
| 20 | if strings.TrimSpace(target.PromptID) == "" || strings.TrimSpace(target.TurnID) == "" || strings.TrimSpace(target.Kind) == "" { |
| 21 | return fmt.Errorf("exact remote prompt identity is required") |
| 22 | } |
| 23 | if err := a.remoteTabPost(target.TabID, "/resolve-prompt", map[string]any{ |
| 24 | "sessionId": target.SessionID, "promptId": target.PromptID, "turnId": target.TurnID, "runtimeEpoch": target.RuntimeEpoch, |
| 25 | "kind": target.Kind, "answer": answer, |
| 26 | }); err != nil { |
| 27 | return err |
| 28 | } |
| 29 | a.clearRemotePendingPromptExact(target) |
| 30 | return nil |
| 31 | } |
| 32 | |
| 33 | func (a *App) SubmitRemoteTabExtensionFormExact(target ExtensionFormTarget, values map[string]any) error { |
| 34 | a.remoteTabMu.Lock() |
| 35 | tab := a.remoteTabs[target.TabID] |
| 36 | supported := tab != nil && tab.capabilities[serveCapabilityExtensionFormInstanceV1] |
| 37 | current := tab != nil && tab.ref.HostID == target.HostID && tab.session.sessionID == target.SessionID && tab.gen == target.SessionGeneration |
| 38 | a.remoteTabMu.Unlock() |
| 39 | if !supported { |
| 40 | return fmt.Errorf("this remote Reasonix Serve does not support %s; upgrade it to submit this extension form safely", serveCapabilityExtensionFormInstanceV1) |
| 41 | } |
| 42 | if !current { |
| 43 | return fmt.Errorf("remote extension form binding is stale") |
| 44 | } |
| 45 | if err := a.remoteTabPost(target.TabID, "/extension-form", map[string]any{ |
| 46 | "sessionId": target.SessionID, "pluginId": target.PluginID, "surfaceId": target.SurfaceID, "generation": target.PluginGeneration, |
| 47 | "formInstanceId": target.FormInstanceID, "values": values, |
| 48 | }); err != nil { |
| 49 | return err |
| 50 | } |
| 51 | a.clearRemotePendingExtensionFormExact(target.TabID, target.PluginID, target.SurfaceID, target.FormInstanceID) |
| 52 | return nil |
| 53 | } |
| 54 |