@pi-in-go/pigpen-ahp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CREDITS.md +27 -0
- package/LICENSE +23 -0
- package/README.md +148 -0
- package/extensions/ahp/access_options_test.go +116 -0
- package/extensions/ahp/extension.go +54 -0
- package/extensions/ahp/go.mod +12 -0
- package/extensions/ahp/go.sum +2 -0
- package/extensions/ahp/go.work +8 -0
- package/extensions/ahp/internal/channels/chat.go +110 -0
- package/extensions/ahp/internal/channels/root.go +32 -0
- package/extensions/ahp/internal/channels/session.go +128 -0
- package/extensions/ahp/internal/channels/session_test.go +108 -0
- package/extensions/ahp/internal/compose/compose.go +153 -0
- package/extensions/ahp/internal/compose/compose_test.go +120 -0
- package/extensions/ahp/internal/gaps/gaps_test.go +88 -0
- package/extensions/ahp/internal/host/handshake_test.go +206 -0
- package/extensions/ahp/internal/host/host.go +1305 -0
- package/extensions/ahp/internal/host/reconnect_test.go +197 -0
- package/extensions/ahp/internal/host/replaywindow_test.go +31 -0
- package/extensions/ahp/internal/host/schema_test.go +79 -0
- package/extensions/ahp/internal/host/store.go +291 -0
- package/extensions/ahp/internal/host/store_update_test.go +85 -0
- package/extensions/ahp/internal/host/subscriptions_test.go +160 -0
- package/extensions/ahp/internal/host/surface_test.go +95 -0
- package/extensions/ahp/internal/host/workarounds.go +458 -0
- package/extensions/ahp/internal/host/workarounds_test.go +96 -0
- package/extensions/ahp/internal/live/live.go +328 -0
- package/extensions/ahp/internal/live/live_test.go +91 -0
- package/extensions/ahp/internal/live/store.go +113 -0
- package/extensions/ahp/internal/mapper/activity.go +199 -0
- package/extensions/ahp/internal/mapper/activity_test.go +188 -0
- package/extensions/ahp/internal/mapper/bench_test.go +38 -0
- package/extensions/ahp/internal/mapper/event_mapper_test.go +380 -0
- package/extensions/ahp/internal/mapper/fixtures_test.go +387 -0
- package/extensions/ahp/internal/mapper/helpers_test.go +251 -0
- package/extensions/ahp/internal/mapper/js.go +131 -0
- package/extensions/ahp/internal/mapper/mapper.go +600 -0
- package/extensions/ahp/internal/mapper/message_input_test.go +196 -0
- package/extensions/ahp/internal/mapper/messageinput.go +272 -0
- package/extensions/ahp/internal/mapper/schema_helpers_test.go +5 -0
- package/extensions/ahp/internal/mapper/testdata/LICENSE-pi-ahp +21 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/abort.json +711 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/bash-long-output.json +1312 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/compaction.json +6285 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/parallel-tools.json +2622 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/plain-text.json +1856 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/single-tool.json +1128 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/steering.json +3926 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/tool-bash.json +2372 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/tool-edit.json +3983 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/tool-error.json +2850 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/tool-find.json +1162 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/tool-grep.json +2783 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/tool-loop.json +1693 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/tool-ls.json +2427 -0
- package/extensions/ahp/internal/mapper/testdata/fixtures/tool-write.json +1271 -0
- package/extensions/ahp/internal/mapper/title.go +34 -0
- package/extensions/ahp/internal/mapper/usermsg.go +87 -0
- package/extensions/ahp/internal/pi/activeturn_test.go +296 -0
- package/extensions/ahp/internal/pi/backend.go +64 -0
- package/extensions/ahp/internal/pi/catalogue.go +370 -0
- package/extensions/ahp/internal/pi/catalogue_test.go +271 -0
- package/extensions/ahp/internal/pi/chatdriver.go +533 -0
- package/extensions/ahp/internal/pi/chatdriver_test.go +416 -0
- package/extensions/ahp/internal/pi/clientactions.go +212 -0
- package/extensions/ahp/internal/pi/clientactions_test.go +273 -0
- package/extensions/ahp/internal/pi/completions.go +230 -0
- package/extensions/ahp/internal/pi/completions_test.go +272 -0
- package/extensions/ahp/internal/pi/config_test.go +269 -0
- package/extensions/ahp/internal/pi/deletesession.go +69 -0
- package/extensions/ahp/internal/pi/deletesession_test.go +153 -0
- package/extensions/ahp/internal/pi/disposal_test.go +362 -0
- package/extensions/ahp/internal/pi/fixture_test.go +308 -0
- package/extensions/ahp/internal/pi/foreign_test.go +122 -0
- package/extensions/ahp/internal/pi/harness_test.go +83 -0
- package/extensions/ahp/internal/pi/history.go +269 -0
- package/extensions/ahp/internal/pi/hydrated_test.go +171 -0
- package/extensions/ahp/internal/pi/hydratedlifecycle_test.go +196 -0
- package/extensions/ahp/internal/pi/hydration_test.go +209 -0
- package/extensions/ahp/internal/pi/hydrator.go +212 -0
- package/extensions/ahp/internal/pi/imageinput.go +224 -0
- package/extensions/ahp/internal/pi/imageinput_test.go +57 -0
- package/extensions/ahp/internal/pi/lifecycle_test.go +381 -0
- package/extensions/ahp/internal/pi/models.go +212 -0
- package/extensions/ahp/internal/pi/models_test.go +128 -0
- package/extensions/ahp/internal/pi/paging.go +95 -0
- package/extensions/ahp/internal/pi/pagingtruncate_test.go +323 -0
- package/extensions/ahp/internal/pi/projecttrust.go +222 -0
- package/extensions/ahp/internal/pi/registry.go +924 -0
- package/extensions/ahp/internal/pi/restart_test.go +185 -0
- package/extensions/ahp/internal/pi/services.go +70 -0
- package/extensions/ahp/internal/pi/sessionconfig.go +64 -0
- package/extensions/ahp/internal/pi/sessionfiles_test.go +74 -0
- package/extensions/ahp/internal/pi/sessionstore.go +83 -0
- package/extensions/ahp/internal/pi/summary_test.go +426 -0
- package/extensions/ahp/internal/pi/workarounds_wire_test.go +208 -0
- package/extensions/ahp/internal/pisession/fromentries_test.go +32 -0
- package/extensions/ahp/internal/pisession/json.go +31 -0
- package/extensions/ahp/internal/pisession/pisession.go +580 -0
- package/extensions/ahp/internal/settings/access.go +63 -0
- package/extensions/ahp/internal/settings/access_test.go +52 -0
- package/extensions/ahp/internal/settings/settings.go +117 -0
- package/extensions/ahp/internal/settings/settings_test.go +104 -0
- package/extensions/ahp/internal/svc/etag_other.go +15 -0
- package/extensions/ahp/internal/svc/etag_unix.go +34 -0
- package/extensions/ahp/internal/svc/glob.go +197 -0
- package/extensions/ahp/internal/svc/mime.go +37 -0
- package/extensions/ahp/internal/svc/paths.go +108 -0
- package/extensions/ahp/internal/svc/pty.go +64 -0
- package/extensions/ahp/internal/svc/pty_darwin.go +42 -0
- package/extensions/ahp/internal/svc/pty_linux.go +36 -0
- package/extensions/ahp/internal/svc/pty_other.go +9 -0
- package/extensions/ahp/internal/svc/pty_test.go +114 -0
- package/extensions/ahp/internal/svc/pty_unix.go +147 -0
- package/extensions/ahp/internal/svc/resource.go +495 -0
- package/extensions/ahp/internal/svc/resource_test.go +501 -0
- package/extensions/ahp/internal/svc/stat_bsd.go +9 -0
- package/extensions/ahp/internal/svc/stat_linux.go +9 -0
- package/extensions/ahp/internal/svc/terminal.go +454 -0
- package/extensions/ahp/internal/svc/terminal_test.go +512 -0
- package/extensions/ahp/internal/svc/watch.go +590 -0
- package/extensions/ahp/internal/svc/watch_test.go +627 -0
- package/extensions/ahp/internal/svc/watchevents_test.go +452 -0
- package/extensions/ahp/internal/svc/watchpolicy.go +81 -0
- package/extensions/ahp/internal/svc/watchpolicy_test.go +151 -0
- package/extensions/ahp/internal/svc/watchracy_test.go +61 -0
- package/extensions/ahp/internal/testkit/schema/LICENSE-agent-host-protocol +21 -0
- package/extensions/ahp/internal/testkit/schema/actions.schema.json +9208 -0
- package/extensions/ahp/internal/testkit/schema/commands.schema.json +10862 -0
- package/extensions/ahp/internal/testkit/schema/errors.schema.json +10928 -0
- package/extensions/ahp/internal/testkit/schema/notifications.schema.json +6667 -0
- package/extensions/ahp/internal/testkit/schema/state.schema.json +6392 -0
- package/extensions/ahp/internal/testkit/schema.go +360 -0
- package/extensions/ahp/internal/testkit/testkit.go +367 -0
- package/extensions/ahp/internal/twin/twin.go +27 -0
- package/extensions/ahp/internal/wire/dispatchable.go +106 -0
- package/extensions/ahp/internal/wire/dispatchable_list.go +15 -0
- package/extensions/ahp/internal/wire/helpers_test.go +5 -0
- package/extensions/ahp/internal/wire/wire.go +218 -0
- package/extensions/ahp/internal/wire/wire_test.go +123 -0
- package/extensions/ahp/internal/ws/helpers_test.go +7 -0
- package/extensions/ahp/internal/ws/vscode_test.go +198 -0
- package/extensions/ahp/internal/ws/ws.go +674 -0
- package/extensions/ahp/internal/ws/ws_test.go +324 -0
- package/extensions/ahp/realpig_test.go +589 -0
- package/extensions/ahp/runtime.go +311 -0
- package/extensions/ahp/runtime_test.go +110 -0
- package/extensions/ahp/testdata/upstream-tests.json +3833 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/LICENSE +21 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/NOTICE-PIGPEN.md +18 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/ahp/client.go +1011 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/ahp/error.go +111 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/ahp/multi_host_state_mirror.go +239 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/ahp/reducers.go +1939 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/ahp/transport.go +176 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/actions.generated.go +2447 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/commands.generated.go +1546 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/common.go +205 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/errors.generated.go +65 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/messages.generated.go +138 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/notifications.generated.go +264 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/state.generated.go +6171 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/ahptypes/version.generated.go +31 -0
- package/extensions/ahp/third_party/agent-host-protocol-go/go.mod +3 -0
- package/extensions/ahp/twins_test.go +91 -0
- package/package.json +40 -0
- package/proof/PORT.md +121 -0
- package/proof/mutations.json +152 -0
- package/proof/oracle/LICENSE +21 -0
- package/proof/oracle/README.md +120 -0
- package/proof/oracle/UPSTREAM.md +7 -0
- package/proof/oracle/package.json +68 -0
- package/proof/oracle/src/bin/cli.ts +66 -0
- package/proof/oracle/src/bin/tunnel.ts +128 -0
- package/proof/oracle/src/channels/chat.ts +134 -0
- package/proof/oracle/src/channels/root.ts +39 -0
- package/proof/oracle/src/channels/session.ts +118 -0
- package/proof/oracle/src/channels/terminal.ts +11 -0
- package/proof/oracle/src/core/channels.ts +108 -0
- package/proof/oracle/src/core/client-workarounds.ts +358 -0
- package/proof/oracle/src/core/connection.ts +41 -0
- package/proof/oracle/src/core/host.ts +882 -0
- package/proof/oracle/src/core/sequencer.ts +75 -0
- package/proof/oracle/src/core/state-store.ts +162 -0
- package/proof/oracle/src/core/uri.ts +25 -0
- package/proof/oracle/src/host/direct-settings.ts +110 -0
- package/proof/oracle/src/host/pi-host.ts +220 -0
- package/proof/oracle/src/host/serve.ts +71 -0
- package/proof/oracle/src/host/terminal-service.ts +346 -0
- package/proof/oracle/src/pi/activity.ts +171 -0
- package/proof/oracle/src/pi/changeset-service.ts +646 -0
- package/proof/oracle/src/pi/changeset-uri.ts +64 -0
- package/proof/oracle/src/pi/chat-driver.ts +529 -0
- package/proof/oracle/src/pi/completions.ts +160 -0
- package/proof/oracle/src/pi/delete-session.ts +53 -0
- package/proof/oracle/src/pi/event-mapper.ts +648 -0
- package/proof/oracle/src/pi/git-changes.ts +605 -0
- package/proof/oracle/src/pi/history.ts +305 -0
- package/proof/oracle/src/pi/image-input.ts +56 -0
- package/proof/oracle/src/pi/image-mime.ts +8 -0
- package/proof/oracle/src/pi/in-process-backend.ts +155 -0
- package/proof/oracle/src/pi/message-input.ts +212 -0
- package/proof/oracle/src/pi/models.ts +124 -0
- package/proof/oracle/src/pi/project-trust.ts +66 -0
- package/proof/oracle/src/pi/provider.ts +2 -0
- package/proof/oracle/src/pi/resource-paths.ts +80 -0
- package/proof/oracle/src/pi/resource-service.ts +356 -0
- package/proof/oracle/src/pi/resource-watch-policy.ts +35 -0
- package/proof/oracle/src/pi/resource-watch.ts +357 -0
- package/proof/oracle/src/pi/session-catalogue.ts +318 -0
- package/proof/oracle/src/pi/session-config.ts +84 -0
- package/proof/oracle/src/pi/session-history.ts +75 -0
- package/proof/oracle/src/pi/session-hydrator.ts +219 -0
- package/proof/oracle/src/pi/session-registry.ts +815 -0
- package/proof/oracle/src/pi/session-storage.ts +29 -0
- package/proof/oracle/src/pi/session-title.ts +18 -0
- package/proof/oracle/src/pi/turn-paging.ts +94 -0
- package/proof/oracle/src/pi/user-message.ts +66 -0
- package/proof/oracle/src/protocol/errors.ts +44 -0
- package/proof/oracle/src/protocol/jsonrpc.ts +89 -0
- package/proof/oracle/src/protocol/version.ts +39 -0
- package/proof/oracle/src/transport/websocket.ts +136 -0
- package/proof/oracle/src/tunnel/devtunnel.ts +293 -0
- package/proof/oracle/src/tunnel/discovery.ts +37 -0
- package/proof/oracle/test/active-turn-reconnect.test.ts +274 -0
- package/proof/oracle/test/activity.test.ts +171 -0
- package/proof/oracle/test/changeset-lifecycle.test.serial.ts +303 -0
- package/proof/oracle/test/changeset-uri.test.ts +37 -0
- package/proof/oracle/test/changeset.test.serial.ts +487 -0
- package/proof/oracle/test/chat-driver.test.ts +691 -0
- package/proof/oracle/test/client-actions.test.ts +409 -0
- package/proof/oracle/test/client-workarounds.test.ts +320 -0
- package/proof/oracle/test/completions.test.ts +323 -0
- package/proof/oracle/test/delete-session.test.ts +142 -0
- package/proof/oracle/test/direct-settings.test.ts +81 -0
- package/proof/oracle/test/event-mapper.test.ts +619 -0
- package/proof/oracle/test/fetch-turns.test.ts +207 -0
- package/proof/oracle/test/fixtures/abort.json +711 -0
- package/proof/oracle/test/fixtures/bash-long-output.json +1312 -0
- package/proof/oracle/test/fixtures/compaction.json +6285 -0
- package/proof/oracle/test/fixtures/parallel-tools.json +2622 -0
- package/proof/oracle/test/fixtures/plain-text.json +1856 -0
- package/proof/oracle/test/fixtures/single-tool.json +1128 -0
- package/proof/oracle/test/fixtures/steering.json +3926 -0
- package/proof/oracle/test/fixtures/tool-bash.json +2372 -0
- package/proof/oracle/test/fixtures/tool-edit.json +3983 -0
- package/proof/oracle/test/fixtures/tool-error.json +2850 -0
- package/proof/oracle/test/fixtures/tool-find.json +1162 -0
- package/proof/oracle/test/fixtures/tool-grep.json +2783 -0
- package/proof/oracle/test/fixtures/tool-loop.json +1693 -0
- package/proof/oracle/test/fixtures/tool-ls.json +2427 -0
- package/proof/oracle/test/fixtures/tool-write.json +1271 -0
- package/proof/oracle/test/handshake.test.ts +275 -0
- package/proof/oracle/test/harness.ts +153 -0
- package/proof/oracle/test/hydrated-session-lifecycle.test.ts +211 -0
- package/proof/oracle/test/image-input.test.ts +28 -0
- package/proof/oracle/test/image-session.test.ts +69 -0
- package/proof/oracle/test/live-turn.test.ts +304 -0
- package/proof/oracle/test/mapper-fixtures.test.ts +293 -0
- package/proof/oracle/test/message-input.test.ts +181 -0
- package/proof/oracle/test/model-discovery.test.ts +170 -0
- package/proof/oracle/test/models.test.ts +109 -0
- package/proof/oracle/test/pi-host.test.ts +91 -0
- package/proof/oracle/test/pi-replay.test.ts +141 -0
- package/proof/oracle/test/project-trust.test.ts +125 -0
- package/proof/oracle/test/protocol-surface.test.ts +121 -0
- package/proof/oracle/test/pty.test.ts +100 -0
- package/proof/oracle/test/reconnect.test.ts +389 -0
- package/proof/oracle/test/resource-watch-policy.test.ts +78 -0
- package/proof/oracle/test/resource-watch.test.serial.ts +536 -0
- package/proof/oracle/test/resource.test.ts +499 -0
- package/proof/oracle/test/schema.test.ts +88 -0
- package/proof/oracle/test/session-catalogue.test.ts +314 -0
- package/proof/oracle/test/session-config.test.ts +224 -0
- package/proof/oracle/test/session-disposal.test.ts +364 -0
- package/proof/oracle/test/session-hydration.test.ts +194 -0
- package/proof/oracle/test/session-lifecycle.test.ts +416 -0
- package/proof/oracle/test/session-storage.test.serial.ts +32 -0
- package/proof/oracle/test/session-summary.test.ts +418 -0
- package/proof/oracle/test/subscriptions.test.ts +198 -0
- package/proof/oracle/test/support/assertions.ts +32 -0
- package/proof/oracle/test/support/async.ts +26 -0
- package/proof/oracle/test/support/hydrated-session.ts +205 -0
- package/proof/oracle/test/support/images.ts +8 -0
- package/proof/oracle/test/support/recorded-fixtures.ts +60 -0
- package/proof/oracle/test/support/recorded-scenarios.ts +145 -0
- package/proof/oracle/test/support/replay.ts +194 -0
- package/proof/oracle/test/support/schema.ts +221 -0
- package/proof/oracle/test/support/session-files.ts +12 -0
- package/proof/oracle/test/support/session-storage.ts +22 -0
- package/proof/oracle/test/support/upstream.ts +25 -0
- package/proof/oracle/test/support/watch-events.ts +108 -0
- package/proof/oracle/test/terminal-service.test.ts +495 -0
- package/proof/oracle/test/truncate.test.ts +230 -0
- package/proof/oracle/test/tunnel.test.ts +258 -0
- package/proof/oracle/test/upstream-workarounds.test.ts +37 -0
- package/proof/oracle/test/uri.test.ts +24 -0
- package/proof/oracle/test/watch-events.test.ts +118 -0
- package/proof/oracle/tsconfig.json +32 -0
- package/proof/proof-piglet/piglet.yaml +18 -0
- package/proof/tools/fakellm/go.mod +3 -0
- package/proof/tools/fakellm/main.go +109 -0
- package/proof/tools/gen-dispatchable.py +30 -0
- package/provenance.json +28 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
package ahp
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"context"
|
|
5
|
+
"encoding/json"
|
|
6
|
+
"fmt"
|
|
7
|
+
"sync"
|
|
8
|
+
|
|
9
|
+
"github.com/microsoft/agent-host-protocol/clients/go/ahptypes"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
// ─── TransportMessage ────────────────────────────────────────────────────
|
|
13
|
+
|
|
14
|
+
// transportFrameKind enumerates the three payload shapes a transport
|
|
15
|
+
// may carry. Most implementations will use TransportFrameText.
|
|
16
|
+
type transportFrameKind int
|
|
17
|
+
|
|
18
|
+
const (
|
|
19
|
+
transportFrameUnset transportFrameKind = iota
|
|
20
|
+
transportFrameParsed
|
|
21
|
+
transportFrameText
|
|
22
|
+
transportFrameBinary
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
// TransportMessage is a single message flowing in or out over a
|
|
26
|
+
// [Transport]. Construct one with one of the helpers below; transports
|
|
27
|
+
// may inspect [TransportMessage.AsParsed] / [TransportMessage.AsBytes]
|
|
28
|
+
// to decide how to ship the payload.
|
|
29
|
+
type TransportMessage struct {
|
|
30
|
+
kind transportFrameKind
|
|
31
|
+
parsed *ahptypes.JsonRpcMessage
|
|
32
|
+
text string
|
|
33
|
+
binary []byte
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// NewParsedMessage wraps an already-decoded JSON-RPC message.
|
|
37
|
+
func NewParsedMessage(m ahptypes.JsonRpcMessage) TransportMessage {
|
|
38
|
+
return TransportMessage{kind: transportFrameParsed, parsed: &m}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// NewTextMessage wraps a text frame whose payload is a JSON-RPC
|
|
42
|
+
// message encoded as UTF-8.
|
|
43
|
+
func NewTextMessage(s string) TransportMessage {
|
|
44
|
+
return TransportMessage{kind: transportFrameText, text: s}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// NewBinaryMessage wraps a binary frame whose payload is a JSON-RPC
|
|
48
|
+
// message encoded as UTF-8.
|
|
49
|
+
func NewBinaryMessage(b []byte) TransportMessage {
|
|
50
|
+
return TransportMessage{kind: transportFrameBinary, binary: b}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// IntoParsed decodes the message into a typed
|
|
54
|
+
// [ahptypes.JsonRpcMessage].
|
|
55
|
+
func (m TransportMessage) IntoParsed() (ahptypes.JsonRpcMessage, error) {
|
|
56
|
+
switch m.kind {
|
|
57
|
+
case transportFrameParsed:
|
|
58
|
+
if m.parsed == nil {
|
|
59
|
+
return ahptypes.JsonRpcMessage{}, &TransportError{Kind: "protocol", Err: fmt.Errorf("parsed message was nil")}
|
|
60
|
+
}
|
|
61
|
+
return *m.parsed, nil
|
|
62
|
+
case transportFrameText:
|
|
63
|
+
var out ahptypes.JsonRpcMessage
|
|
64
|
+
if err := json.Unmarshal([]byte(m.text), &out); err != nil {
|
|
65
|
+
return ahptypes.JsonRpcMessage{}, &TransportError{Kind: "protocol", Err: err}
|
|
66
|
+
}
|
|
67
|
+
return out, nil
|
|
68
|
+
case transportFrameBinary:
|
|
69
|
+
var out ahptypes.JsonRpcMessage
|
|
70
|
+
if err := json.Unmarshal(m.binary, &out); err != nil {
|
|
71
|
+
return ahptypes.JsonRpcMessage{}, &TransportError{Kind: "protocol", Err: err}
|
|
72
|
+
}
|
|
73
|
+
return out, nil
|
|
74
|
+
default:
|
|
75
|
+
return ahptypes.JsonRpcMessage{}, &TransportError{Kind: "protocol", Err: fmt.Errorf("empty TransportMessage")}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// EncodeMessage builds a TransportMessage carrying a JSON-encoded
|
|
80
|
+
// payload, suitable for sending over a text-framed transport.
|
|
81
|
+
func EncodeMessage(m ahptypes.JsonRpcMessage) (TransportMessage, error) {
|
|
82
|
+
b, err := json.Marshal(m)
|
|
83
|
+
if err != nil {
|
|
84
|
+
return TransportMessage{}, &TransportError{Kind: "protocol", Err: err}
|
|
85
|
+
}
|
|
86
|
+
return NewTextMessage(string(b)), nil
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Bytes returns the wire payload of m as UTF-8 bytes plus a flag
|
|
90
|
+
// indicating whether the original frame was binary. Parsed messages
|
|
91
|
+
// are re-encoded via [encoding/json].
|
|
92
|
+
func (m TransportMessage) Bytes() ([]byte, bool, error) {
|
|
93
|
+
switch m.kind {
|
|
94
|
+
case transportFrameText:
|
|
95
|
+
return []byte(m.text), false, nil
|
|
96
|
+
case transportFrameBinary:
|
|
97
|
+
return m.binary, true, nil
|
|
98
|
+
case transportFrameParsed:
|
|
99
|
+
if m.parsed == nil {
|
|
100
|
+
return nil, false, &TransportError{Kind: "protocol", Err: fmt.Errorf("parsed message was nil")}
|
|
101
|
+
}
|
|
102
|
+
b, err := json.Marshal(m.parsed)
|
|
103
|
+
if err != nil {
|
|
104
|
+
return nil, false, &TransportError{Kind: "protocol", Err: err}
|
|
105
|
+
}
|
|
106
|
+
return b, false, nil
|
|
107
|
+
default:
|
|
108
|
+
return nil, false, &TransportError{Kind: "protocol", Err: fmt.Errorf("empty TransportMessage")}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// ─── Transport interface ────────────────────────────────────────────────
|
|
113
|
+
|
|
114
|
+
// Transport is the pluggable byte-stream abstraction the [Client]
|
|
115
|
+
// drives. Implementations deliver inbound messages in order and accept
|
|
116
|
+
// outbound sends serially. Concurrent calls to [Transport.Send] are
|
|
117
|
+
// the caller's responsibility — the [Client] serializes its own
|
|
118
|
+
// outbound traffic through an internal queue.
|
|
119
|
+
//
|
|
120
|
+
// Returning a non-nil error from [Transport.Recv] indicates an abnormal
|
|
121
|
+
// closure; returning ([TransportMessage]{}, nil) with the zero-value
|
|
122
|
+
// frame signals clean end-of-stream — but most implementations will
|
|
123
|
+
// instead return ([TransportMessage]{}, [ErrClosed]) wrapped in a
|
|
124
|
+
// [TransportError] of kind "closed".
|
|
125
|
+
type Transport interface {
|
|
126
|
+
// Send writes a single message. Implementations should respect ctx
|
|
127
|
+
// cancellation so the caller can abort a stuck write.
|
|
128
|
+
Send(ctx context.Context, m TransportMessage) error
|
|
129
|
+
|
|
130
|
+
// Recv blocks for the next inbound message. Returning a wrapped
|
|
131
|
+
// [ErrClosed] is the canonical end-of-stream signal.
|
|
132
|
+
Recv(ctx context.Context) (TransportMessage, error)
|
|
133
|
+
|
|
134
|
+
// Close releases any underlying resources. Calling Close while a
|
|
135
|
+
// Recv is in flight should cause that Recv to return promptly with
|
|
136
|
+
// a closed-transport error.
|
|
137
|
+
Close(ctx context.Context) error
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ─── BoxedTransport ─────────────────────────────────────────────────────
|
|
141
|
+
|
|
142
|
+
// BoxedTransport is a thin reference-counted handle around a
|
|
143
|
+
// [Transport]. The multi-host runtime uses BoxedTransport to hold
|
|
144
|
+
// heterogeneous transports in a single registry without leaking the
|
|
145
|
+
// concrete type into shared code paths.
|
|
146
|
+
//
|
|
147
|
+
// Concurrent Send calls are serialized via an internal mutex so that
|
|
148
|
+
// transport implementations that are not themselves safe for
|
|
149
|
+
// concurrent Send (e.g. raw WebSocket writers) work out of the box.
|
|
150
|
+
type BoxedTransport struct {
|
|
151
|
+
inner Transport
|
|
152
|
+
writerMu sync.Mutex
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// NewBoxedTransport wraps t in a [BoxedTransport].
|
|
156
|
+
func NewBoxedTransport(t Transport) *BoxedTransport {
|
|
157
|
+
return &BoxedTransport{inner: t}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Send forwards to the underlying transport, serializing concurrent
|
|
161
|
+
// writes through an internal mutex.
|
|
162
|
+
func (b *BoxedTransport) Send(ctx context.Context, m TransportMessage) error {
|
|
163
|
+
b.writerMu.Lock()
|
|
164
|
+
defer b.writerMu.Unlock()
|
|
165
|
+
return b.inner.Send(ctx, m)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Recv forwards to the underlying transport.
|
|
169
|
+
func (b *BoxedTransport) Recv(ctx context.Context) (TransportMessage, error) {
|
|
170
|
+
return b.inner.Recv(ctx)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Close forwards to the underlying transport.
|
|
174
|
+
func (b *BoxedTransport) Close(ctx context.Context) error {
|
|
175
|
+
return b.inner.Close(ctx)
|
|
176
|
+
}
|