@openscout/protocol 0.2.63 → 0.2.82
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/LICENSE +202 -0
- package/README.md +103 -52
- package/dist/a2a.d.ts +224 -0
- package/dist/a2a.d.ts.map +1 -0
- package/dist/a2a.js +225 -0
- package/dist/activity.d.ts +70 -0
- package/dist/activity.d.ts.map +1 -0
- package/dist/activity.js +1 -0
- package/dist/actors.d.ts +7 -3
- package/dist/actors.d.ts.map +1 -0
- package/dist/actors.js +15 -1
- package/dist/agent-broker-feed.d.ts +84 -0
- package/dist/agent-broker-feed.d.ts.map +1 -0
- package/dist/agent-broker-feed.js +1 -0
- package/dist/agent-identity.d.ts +23 -0
- package/dist/agent-identity.d.ts.map +1 -0
- package/dist/agent-identity.js +122 -8
- package/dist/agent-runs.d.ts +191 -0
- package/dist/agent-runs.d.ts.map +1 -0
- package/dist/agent-runs.js +365 -0
- package/dist/assigned-roles.d.ts +205 -0
- package/dist/assigned-roles.d.ts.map +1 -0
- package/dist/assigned-roles.js +228 -0
- package/dist/broker-routes.d.ts +40 -0
- package/dist/broker-routes.d.ts.map +1 -0
- package/dist/broker-routes.js +56 -0
- package/dist/budget.d.ts +65 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +19 -0
- package/dist/capability-matrix.d.ts +230 -0
- package/dist/capability-matrix.d.ts.map +1 -0
- package/dist/capability-matrix.js +304 -0
- package/dist/channel-identity.d.ts +40 -0
- package/dist/channel-identity.d.ts.map +1 -0
- package/dist/channel-identity.js +108 -0
- package/dist/collaboration.d.ts +45 -16
- package/dist/collaboration.d.ts.map +1 -0
- package/dist/collaboration.js +39 -23
- package/dist/common.d.ts +4 -3
- package/dist/common.d.ts.map +1 -0
- package/dist/conversations.d.ts +1 -0
- package/dist/conversations.d.ts.map +1 -0
- package/dist/cursor-transport.d.ts +22 -0
- package/dist/cursor-transport.d.ts.map +1 -0
- package/dist/cursor-transport.js +10 -0
- package/dist/debug-attach.d.ts +29 -0
- package/dist/debug-attach.d.ts.map +1 -0
- package/dist/debug-attach.js +6 -0
- package/dist/deliveries.d.ts +16 -2
- package/dist/deliveries.d.ts.map +1 -0
- package/dist/durable-actions.d.ts +94 -0
- package/dist/durable-actions.d.ts.map +1 -0
- package/dist/durable-actions.js +1 -0
- package/dist/events.d.ts +27 -1
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +14 -1
- package/dist/harness-feature-support.d.ts +76 -0
- package/dist/harness-feature-support.d.ts.map +1 -0
- package/dist/harness-feature-support.js +29 -0
- package/dist/host-integrations.d.ts +22 -0
- package/dist/host-integrations.d.ts.map +1 -0
- package/dist/host-integrations.js +64 -0
- package/dist/inbox.d.ts +50 -0
- package/dist/inbox.d.ts.map +1 -0
- package/dist/inbox.js +9 -0
- package/dist/index.d.ts +36 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -2
- package/dist/invocations.d.ts +121 -0
- package/dist/invocations.d.ts.map +1 -0
- package/dist/invocations.js +201 -1
- package/dist/mesh.d.ts +98 -0
- package/dist/mesh.d.ts.map +1 -0
- package/dist/mesh.js +18 -1
- package/dist/messages.d.ts +3 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/native-interactions.d.ts +30 -0
- package/dist/native-interactions.d.ts.map +1 -0
- package/dist/native-interactions.js +51 -0
- package/dist/observed-status.d.ts +33 -0
- package/dist/observed-status.d.ts.map +1 -0
- package/dist/observed-status.js +6 -0
- package/dist/orchestrator-prompt.d.ts +10 -0
- package/dist/orchestrator-prompt.d.ts.map +1 -0
- package/dist/orchestrator-prompt.js +36 -0
- package/dist/permission-policy.d.ts +5 -0
- package/dist/permission-policy.d.ts.map +1 -0
- package/dist/permission-policy.js +15 -0
- package/dist/provisional-agent-names.d.ts +30 -0
- package/dist/provisional-agent-names.d.ts.map +1 -0
- package/dist/provisional-agent-names.js +224 -0
- package/dist/read-receipts.d.ts +12 -0
- package/dist/read-receipts.d.ts.map +1 -0
- package/dist/read-receipts.js +1 -0
- package/dist/relay-agent-card.d.ts +10 -0
- package/dist/relay-agent-card.d.ts.map +1 -0
- package/dist/rendezvous.d.ts +97 -0
- package/dist/rendezvous.d.ts.map +1 -0
- package/dist/rendezvous.js +35 -0
- package/dist/reserved-vocabulary.d.ts +21 -0
- package/dist/reserved-vocabulary.d.ts.map +1 -0
- package/dist/reserved-vocabulary.js +101 -0
- package/dist/route-aliases.d.ts +112 -0
- package/dist/route-aliases.d.ts.map +1 -0
- package/dist/route-aliases.js +1 -0
- package/dist/runtime-catalog-contract.d.ts +39 -0
- package/dist/runtime-catalog-contract.d.ts.map +1 -0
- package/dist/runtime-catalog-contract.js +17 -0
- package/dist/runtime-catalog.d.ts +11 -0
- package/dist/runtime-catalog.d.ts.map +1 -0
- package/dist/runtime-catalog.generated.d.ts +230 -0
- package/dist/runtime-catalog.generated.d.ts.map +1 -0
- package/dist/runtime-catalog.generated.js +299 -0
- package/dist/runtime-catalog.js +192 -0
- package/dist/runtime-execution.d.ts +161 -0
- package/dist/runtime-execution.d.ts.map +1 -0
- package/dist/runtime-execution.js +327 -0
- package/dist/runtime-profiles.d.ts +12 -0
- package/dist/runtime-profiles.d.ts.map +1 -0
- package/dist/runtime-profiles.js +20 -0
- package/dist/scout-agent-card.d.ts +10 -0
- package/dist/scout-agent-card.d.ts.map +1 -0
- package/dist/scout-composer.d.ts +27 -0
- package/dist/scout-composer.d.ts.map +1 -0
- package/dist/scout-composer.js +192 -0
- package/dist/scout-delivery.d.ts +101 -4
- package/dist/scout-delivery.d.ts.map +1 -0
- package/dist/scout-dispatch.d.ts +44 -3
- package/dist/scout-dispatch.d.ts.map +1 -0
- package/dist/scout-reply-context.d.ts +14 -0
- package/dist/scout-reply-context.d.ts.map +1 -0
- package/dist/scout-reply-context.js +1 -0
- package/dist/session-display-state.d.ts +132 -0
- package/dist/session-display-state.d.ts.map +1 -0
- package/dist/session-display-state.js +94 -0
- package/dist/terminal-host-topology.d.ts +119 -0
- package/dist/terminal-host-topology.d.ts.map +1 -0
- package/dist/terminal-host-topology.js +21 -0
- package/dist/terminal-sessions.d.ts +142 -0
- package/dist/terminal-sessions.d.ts.map +1 -0
- package/dist/terminal-sessions.js +81 -0
- package/dist/terminal-surface-id.d.ts +73 -0
- package/dist/terminal-surface-id.d.ts.map +1 -0
- package/dist/terminal-surface-id.js +162 -0
- package/dist/terminal-workspaces.d.ts +199 -0
- package/dist/terminal-workspaces.d.ts.map +1 -0
- package/dist/terminal-workspaces.js +287 -0
- package/dist/thread-events.d.ts +1 -0
- package/dist/thread-events.d.ts.map +1 -0
- package/dist/time.d.ts +16 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/time.js +33 -0
- package/dist/transports.d.ts +1 -0
- package/dist/transports.d.ts.map +1 -0
- package/package.json +37 -9
- package/src/a2a.ts +471 -0
- package/src/activity.ts +113 -0
- package/src/actors.ts +42 -8
- package/src/agent-broker-feed.ts +102 -0
- package/src/agent-identity.ts +143 -8
- package/src/agent-runs.ts +675 -0
- package/src/assigned-roles.ts +437 -0
- package/src/broker-routes.ts +62 -0
- package/src/budget.ts +88 -0
- package/src/capability-matrix.ts +648 -0
- package/src/channel-identity.ts +147 -0
- package/src/collaboration.ts +78 -48
- package/src/common.ts +24 -5
- package/src/cursor-transport.ts +34 -0
- package/src/debug-attach.ts +38 -0
- package/src/deliveries.ts +16 -1
- package/src/durable-actions.ts +125 -0
- package/src/events.ts +31 -0
- package/src/harness-feature-support.ts +116 -0
- package/src/host-integrations.ts +104 -0
- package/src/inbox.ts +68 -0
- package/src/index.ts +35 -2
- package/src/invocations.ts +353 -0
- package/src/mesh.ts +130 -0
- package/src/messages.ts +2 -0
- package/src/native-interactions.ts +100 -0
- package/src/observed-status.ts +90 -0
- package/src/orchestrator-prompt.ts +47 -0
- package/src/permission-policy.ts +21 -0
- package/src/provisional-agent-names.ts +272 -0
- package/src/read-receipts.ts +12 -0
- package/src/relay-agent-card.ts +73 -63
- package/src/rendezvous.ts +154 -0
- package/src/reserved-vocabulary.ts +135 -0
- package/src/route-aliases.ts +130 -0
- package/src/runtime-catalog-contract.ts +60 -0
- package/src/runtime-catalog.generated.ts +300 -0
- package/src/runtime-catalog.md +21 -0
- package/src/runtime-catalog.ts +193 -0
- package/src/runtime-catalog.v1.json +81 -0
- package/src/runtime-execution.ts +545 -0
- package/src/runtime-profiles.ts +37 -0
- package/src/scout-agent-card.ts +10 -0
- package/src/scout-composer.ts +249 -0
- package/src/scout-delivery.ts +117 -4
- package/src/scout-dispatch.ts +34 -2
- package/src/scout-reply-context.ts +15 -0
- package/src/session-display-state.ts +202 -0
- package/src/terminal-host-topology.ts +132 -0
- package/src/terminal-sessions.ts +187 -0
- package/src/terminal-surface-id.ts +189 -0
- package/src/terminal-workspaces.ts +455 -0
- package/src/time.ts +49 -0
- package/dist/agent-address.d.ts +0 -1
- package/dist/agent-address.js +0 -1
- package/dist/agent-selectors.d.ts +0 -1
- package/dist/agent-selectors.js +0 -1
- package/src/agent-address.ts +0 -1
- package/src/agent-identity.test.ts +0 -435
- package/src/agent-selectors.ts +0 -1
- package/src/scout-agent-card.test.ts +0 -54
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-interactions.d.ts","sourceRoot":"","sources":["../src/native-interactions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,4BAA4B,GACpC,UAAU,GACV,eAAe,GACf,iBAAiB,GACjB,mBAAmB,GACnB,eAAe,GACf,WAAW,GACX,OAAO,CAAC;AAEZ,MAAM,MAAM,gCAAgC,GACxC,UAAU,GACV,WAAW,GACX,YAAY,GACZ,QAAQ,GACR,SAAS,GACT,oBAAoB,CAAC;AAEzB,MAAM,WAAW,8BAA8B;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,4BAA4B,CAAC;IACnC,MAAM,EAAE,8BAA8B,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,4BAA4B,CAAC;IACnC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,gCAAgC,EAAE,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,2CAA2C,EAAE,SAAS,+BAA+B,EA2CxF,CAAC;AAEX,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,4BAA4B,GACjC,gCAAgC,EAAE,CAEpC;AAED,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,4BAA4B,GAAG,SAAS,CAGzG"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export const DEFAULT_HARNESS_NATIVE_INTERACTION_MAPPINGS = [
|
|
2
|
+
{
|
|
3
|
+
kind: "question",
|
|
4
|
+
nativeNames: ["ask_user"],
|
|
5
|
+
scoutTargets: ["question", "session_projection"],
|
|
6
|
+
description: "A harness-native user question becomes a Scout question.",
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
kind: "plan_approval",
|
|
10
|
+
nativeNames: ["submit_plan"],
|
|
11
|
+
scoutTargets: ["work_item", "session_projection"],
|
|
12
|
+
description: "A harness-native plan review becomes a Scout work item or review-needed projection.",
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
kind: "task_projection",
|
|
16
|
+
nativeNames: ["task_write", "task_update", "task_complete", "task_check"],
|
|
17
|
+
scoutTargets: ["work_item", "session_projection"],
|
|
18
|
+
description: "Harness-native task tools project into Scout work item task state.",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
kind: "subagent_activity",
|
|
22
|
+
nativeNames: ["subagent"],
|
|
23
|
+
scoutTargets: ["invocation", "flight", "session_projection"],
|
|
24
|
+
description: "Harness-native child agent activity links to child invocations or observed child runs.",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
kind: "tool_approval",
|
|
28
|
+
nativeNames: ["tool_approval_required"],
|
|
29
|
+
scoutTargets: ["session_projection"],
|
|
30
|
+
description: "A harness-native tool approval projects into session state.",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
kind: "follow_up",
|
|
34
|
+
nativeNames: ["follow_up"],
|
|
35
|
+
scoutTargets: ["message", "session_projection"],
|
|
36
|
+
description: "A queued follow-up remains in the same conversation/session context.",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
kind: "steer",
|
|
40
|
+
nativeNames: ["steer"],
|
|
41
|
+
scoutTargets: ["flight", "message", "session_projection"],
|
|
42
|
+
description: "A steering request redirects the active session or flight with an explicit reason.",
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
export function scoutTargetsForNativeInteraction(kind) {
|
|
46
|
+
return [...(DEFAULT_HARNESS_NATIVE_INTERACTION_MAPPINGS.find(mapping => mapping.kind === kind)?.scoutTargets ?? [])];
|
|
47
|
+
}
|
|
48
|
+
export function nativeInteractionKindForName(nativeName) {
|
|
49
|
+
const normalized = nativeName.trim();
|
|
50
|
+
return DEFAULT_HARNESS_NATIVE_INTERACTION_MAPPINGS.find(mapping => mapping.nativeNames.includes(normalized))?.kind;
|
|
51
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { MetadataMap, ScoutId } from "./common.js";
|
|
2
|
+
export type ObservedStatusPhase = "unconfigured" | "registered" | "starting" | "connecting" | "running" | "stopping" | "stopped" | "closed" | "error" | "unknown";
|
|
3
|
+
export type ObservedActivity = "idle" | "queued" | "waking" | "thinking" | "executing" | "working" | "waiting_for_input" | "waiting_on_actor" | "blocked" | "review" | "completed" | "failed" | "cancelled" | "stalled" | "offline" | "unknown";
|
|
4
|
+
export type ObservedStatusSubjectKind = "agent" | "endpoint" | "flight" | "run" | "question" | "work_item" | "pairing_runtime" | "tail_session";
|
|
5
|
+
export type ObservedStatusProvenanceSource = "broker_record" | "endpoint" | "flight" | "agent_run" | "collaboration_record" | "session_trace" | "pairing_runtime" | "tail_event" | "process" | "tmux" | "staleness_inference";
|
|
6
|
+
export interface ObservedStatusDetail {
|
|
7
|
+
title?: string;
|
|
8
|
+
summary?: string;
|
|
9
|
+
toolName?: string;
|
|
10
|
+
waitingOn?: unknown;
|
|
11
|
+
sourceCursor?: string;
|
|
12
|
+
metadata?: MetadataMap;
|
|
13
|
+
}
|
|
14
|
+
export interface StatusProjectionProvenance {
|
|
15
|
+
source: ObservedStatusProvenanceSource;
|
|
16
|
+
refId: ScoutId;
|
|
17
|
+
observedAt: number;
|
|
18
|
+
confidence: number;
|
|
19
|
+
}
|
|
20
|
+
export interface ObservedStatusProjection {
|
|
21
|
+
subjectKind: ObservedStatusSubjectKind;
|
|
22
|
+
subjectId: ScoutId;
|
|
23
|
+
agentId?: ScoutId;
|
|
24
|
+
phase: ObservedStatusPhase;
|
|
25
|
+
activity: ObservedActivity;
|
|
26
|
+
detail?: ObservedStatusDetail;
|
|
27
|
+
provenance: StatusProjectionProvenance[];
|
|
28
|
+
confidence: number;
|
|
29
|
+
updatedAt: number;
|
|
30
|
+
staleAt?: number;
|
|
31
|
+
}
|
|
32
|
+
export declare function observedStatusDisplay(status: Pick<ObservedStatusProjection, "phase" | "activity">): string;
|
|
33
|
+
//# sourceMappingURL=observed-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observed-status.d.ts","sourceRoot":"","sources":["../src/observed-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAC3B,cAAc,GACd,YAAY,GACZ,UAAU,GACV,YAAY,GACZ,SAAS,GACT,UAAU,GACV,SAAS,GACT,QAAQ,GACR,OAAO,GACP,SAAS,CAAC;AAEd,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,WAAW,GACX,SAAS,GACT,mBAAmB,GACnB,kBAAkB,GAClB,SAAS,GACT,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,WAAW,GACX,SAAS,GACT,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,MAAM,yBAAyB,GACjC,OAAO,GACP,UAAU,GACV,QAAQ,GACR,KAAK,GACL,UAAU,GACV,WAAW,GACX,iBAAiB,GACjB,cAAc,CAAC;AAEnB,MAAM,MAAM,8BAA8B,GACtC,eAAe,GACf,UAAU,GACV,QAAQ,GACR,WAAW,GACX,sBAAsB,GACtB,eAAe,GACf,iBAAiB,GACjB,YAAY,GACZ,SAAS,GACT,MAAM,GACN,qBAAqB,CAAC;AAE1B,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,8BAA8B,CAAC;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,yBAAyB,CAAC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,mBAAmB,CAAC;IAC3B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,UAAU,EAAE,0BAA0B,EAAE,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,wBAAwB,EAAE,OAAO,GAAG,UAAU,CAAC,GAAG,MAAM,CAK1G"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Soft-mode prompt fragment for agents with an active orchestrator assignment.
|
|
3
|
+
* Inject into the agent system/tool preamble when assignment is present.
|
|
4
|
+
*/
|
|
5
|
+
import { type ScoutRoleAssignment } from "./assigned-roles.js";
|
|
6
|
+
export declare function orchestratorSoftPrompt(opts: {
|
|
7
|
+
assignment: ScoutRoleAssignment;
|
|
8
|
+
missionId?: string;
|
|
9
|
+
}): string;
|
|
10
|
+
//# sourceMappingURL=orchestrator-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-prompt.d.ts","sourceRoot":"","sources":["../src/orchestrator-prompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,qBAAqB,CAAC;AAE7B,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,UAAU,EAAE,mBAAmB,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAgCT"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Soft-mode prompt fragment for agents with an active orchestrator assignment.
|
|
3
|
+
* Inject into the agent system/tool preamble when assignment is present.
|
|
4
|
+
*/
|
|
5
|
+
import { SCOUT_MISSION_LOG_LIMITS, SCOUT_ORCHESTRATOR_ROLE, } from "./assigned-roles.js";
|
|
6
|
+
export function orchestratorSoftPrompt(opts) {
|
|
7
|
+
const missionLine = opts.assignment.scope.kind === "mission"
|
|
8
|
+
? `Mission (work id): ${opts.assignment.scope.missionId}`
|
|
9
|
+
: opts.missionId
|
|
10
|
+
? `Active mission context: ${opts.missionId} (standing orchestrator assignment)`
|
|
11
|
+
: "Standing orchestrator: prefer mission-scoped assignment when a campaign exists.";
|
|
12
|
+
return [
|
|
13
|
+
`# Orchestrator role (assigned)`,
|
|
14
|
+
"",
|
|
15
|
+
`You are assigned the **${SCOUT_ORCHESTRATOR_ROLE.label}** role.`,
|
|
16
|
+
SCOUT_ORCHESTRATOR_ROLE.summary,
|
|
17
|
+
missionLine,
|
|
18
|
+
"",
|
|
19
|
+
"## Duties",
|
|
20
|
+
"- Own the mission spine: keep child work/asks linked under the campaign root.",
|
|
21
|
+
"- On mission moments (turn end, delegation, waiting, finish), append a short mission log entry.",
|
|
22
|
+
"- When blocked, set who holds the next move.",
|
|
23
|
+
"- Do not spam: only mission-level moments, not every tool call.",
|
|
24
|
+
"",
|
|
25
|
+
"## Mission log fields",
|
|
26
|
+
`- intent: stable goal (≤ ${SCOUT_MISSION_LOG_LIMITS.intentMaxWords} words)`,
|
|
27
|
+
`- status: current action (≤ ${SCOUT_MISSION_LOG_LIMITS.statusMaxWords} words)`,
|
|
28
|
+
`- kind: heartbeat | progress | delegation | waiting | decision | risk | integration | done | failed`,
|
|
29
|
+
`- note: optional, ≤ ${SCOUT_MISSION_LOG_LIMITS.noteMaxChars} chars`,
|
|
30
|
+
"",
|
|
31
|
+
"## How to write",
|
|
32
|
+
"- CLI: `scout role log-append <missionId> --actor <you> --kind progress --intent \"...\" --status \"...\"`",
|
|
33
|
+
"- HTTP: `POST /api/missions/<missionId>/log` with actorId, kind, intent, status",
|
|
34
|
+
"- Verbose chat stays in DMs; mission log is the cheap reconstruction stream.",
|
|
35
|
+
].join("\n");
|
|
36
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const SCOUT_PERMISSION_PROFILES: readonly ["observe", "review", "workspace_write", "sandboxed_write", "trusted_local", "external_sandbox"];
|
|
2
|
+
export type ScoutPermissionProfile = typeof SCOUT_PERMISSION_PROFILES[number];
|
|
3
|
+
export declare function normalizeScoutPermissionProfile(value: string | null | undefined): ScoutPermissionProfile | undefined;
|
|
4
|
+
export declare function formatScoutPermissionProfiles(): string;
|
|
5
|
+
//# sourceMappingURL=permission-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-policy.d.ts","sourceRoot":"","sources":["../src/permission-policy.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,yBAAyB,2GAO5B,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAAG,OAAO,yBAAyB,CAAC,MAAM,CAAC,CAAC;AAE9E,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,sBAAsB,GAAG,SAAS,CAGpC;AAED,wBAAgB,6BAA6B,IAAI,MAAM,CAEtD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const SCOUT_PERMISSION_PROFILES = [
|
|
2
|
+
"observe",
|
|
3
|
+
"review",
|
|
4
|
+
"workspace_write",
|
|
5
|
+
"sandboxed_write",
|
|
6
|
+
"trusted_local",
|
|
7
|
+
"external_sandbox",
|
|
8
|
+
];
|
|
9
|
+
export function normalizeScoutPermissionProfile(value) {
|
|
10
|
+
const normalized = value?.trim().replaceAll("-", "_");
|
|
11
|
+
return SCOUT_PERMISSION_PROFILES.find((profile) => profile === normalized);
|
|
12
|
+
}
|
|
13
|
+
export function formatScoutPermissionProfiles() {
|
|
14
|
+
return SCOUT_PERMISSION_PROFILES.join("|");
|
|
15
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Curated rotation pool for provisional agent identities.
|
|
3
|
+
*
|
|
4
|
+
* Names are short, human-addressable, and collision-resistant across a local
|
|
5
|
+
* fleet. Categories include scientists, composers, philosophers, and a few
|
|
6
|
+
* literary figures — chosen for memorability, not biographical endorsement.
|
|
7
|
+
*/
|
|
8
|
+
export declare const PROVISIONAL_AGENT_NAMES: readonly ["archimedes", "avogadro", "bohr", "boyle", "copernicus", "curie", "dalton", "darwin", "dirac", "einstein", "euler", "faraday", "feynman", "fermi", "fourier", "galileo", "gauss", "hawking", "heisenberg", "hooke", "hopper", "hypatia", "kepler", "lavoisier", "lovelace", "maxwell", "mendel", "newton", "noether", "oppenheimer", "pasteur", "pauli", "planck", "pythagoras", "rutherford", "sagan", "turing", "volterra", "bach", "bartok", "beethoven", "brahms", "chopin", "debussy", "dvorak", "grieg", "handel", "haydn", "liszt", "mahler", "monteverdi", "mozart", "prokofiev", "purcell", "ravel", "satie", "schubert", "schumann", "stravinsky", "tchaikovsky", "vivaldi", "wagner", "aquinas", "aristotle", "confucius", "descartes", "epicurus", "hegel", "hume", "kant", "kierkegaard", "locke", "machiavelli", "nietzsche", "plato", "popper", "rousseau", "russell", "seneca", "socrates", "spinoza", "voltaire", "wittgenstein", "zeno", "austen", "borges", "dickens", "dostoevsky", "homer", "kafka", "orwell", "shakespeare", "tolstoy", "virgil", "woolf", "atlas", "cobalt", "drover", "hudson", "pike", "quill"];
|
|
9
|
+
export type ProvisionalAgentName = (typeof PROVISIONAL_AGENT_NAMES)[number];
|
|
10
|
+
export declare function normalizeProvisionalAgentNameCandidates(candidates: Iterable<string>): string[];
|
|
11
|
+
export declare function parseProvisionalAgentNamesText(content: string): string[];
|
|
12
|
+
export declare function parseProvisionalAgentNamesJson(content: string): string[];
|
|
13
|
+
export declare function isProvisionalAgentName(value: string, pool?: readonly string[]): boolean;
|
|
14
|
+
/** Extract the base definition id from an agent id, handle, or @label. */
|
|
15
|
+
export declare function definitionIdFromOccupancyKey(value: string): string | null;
|
|
16
|
+
export declare function collectOccupiedDefinitionIds(references: Iterable<string>): Set<string>;
|
|
17
|
+
export type AllocateProvisionalAgentNameOptions = {
|
|
18
|
+
/** When set, allocation starts scanning from this pool index (wraps). */
|
|
19
|
+
startIndex?: number;
|
|
20
|
+
/** Override the built-in pool (for example operator-configured names). */
|
|
21
|
+
pool?: readonly string[];
|
|
22
|
+
};
|
|
23
|
+
export type ProvisionalAgentNameSeedPart = string | number | boolean | null | undefined;
|
|
24
|
+
export declare function provisionalAgentNameStartIndexForSeed(seedParts: Iterable<ProvisionalAgentNameSeedPart>, pool?: readonly string[]): number;
|
|
25
|
+
/**
|
|
26
|
+
* Pick the next free name from the pool.
|
|
27
|
+
* Falls back to `{poolName}-{n}` only when the entire pool is occupied.
|
|
28
|
+
*/
|
|
29
|
+
export declare function allocateProvisionalAgentName(occupied: ReadonlySet<string> | Iterable<string>, options?: AllocateProvisionalAgentNameOptions): string;
|
|
30
|
+
//# sourceMappingURL=provisional-agent-names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisional-agent-names.d.ts","sourceRoot":"","sources":["../src/provisional-agent-names.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,olCA2G1B,CAAC;AAEX,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,wBAAgB,uCAAuC,CACrD,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,GAC3B,MAAM,EAAE,CAcV;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAExE;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBxE;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,SAAS,MAAM,EAA4B,GAChD,OAAO,CAGT;AAED,0EAA0E;AAC1E,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAczE;AAED,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAStF;AAED,MAAM,MAAM,mCAAmC,GAAG;IAChD,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAWxF,wBAAgB,qCAAqC,CACnD,SAAS,EAAE,QAAQ,CAAC,4BAA4B,CAAC,EACjD,IAAI,GAAE,SAAS,MAAM,EAA4B,GAChD,MAAM,CAgBR;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,EAChD,OAAO,GAAE,mCAAwC,GAChD,MAAM,CAwBR"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { normalizeAgentSelectorSegment, parseAgentIdentity } from "./agent-identity.js";
|
|
2
|
+
/**
|
|
3
|
+
* Curated rotation pool for provisional agent identities.
|
|
4
|
+
*
|
|
5
|
+
* Names are short, human-addressable, and collision-resistant across a local
|
|
6
|
+
* fleet. Categories include scientists, composers, philosophers, and a few
|
|
7
|
+
* literary figures — chosen for memorability, not biographical endorsement.
|
|
8
|
+
*/
|
|
9
|
+
export const PROVISIONAL_AGENT_NAMES = [
|
|
10
|
+
// Scientists & inventors
|
|
11
|
+
"archimedes",
|
|
12
|
+
"avogadro",
|
|
13
|
+
"bohr",
|
|
14
|
+
"boyle",
|
|
15
|
+
"copernicus",
|
|
16
|
+
"curie",
|
|
17
|
+
"dalton",
|
|
18
|
+
"darwin",
|
|
19
|
+
"dirac",
|
|
20
|
+
"einstein",
|
|
21
|
+
"euler",
|
|
22
|
+
"faraday",
|
|
23
|
+
"feynman",
|
|
24
|
+
"fermi",
|
|
25
|
+
"fourier",
|
|
26
|
+
"galileo",
|
|
27
|
+
"gauss",
|
|
28
|
+
"hawking",
|
|
29
|
+
"heisenberg",
|
|
30
|
+
"hooke",
|
|
31
|
+
"hopper",
|
|
32
|
+
"hypatia",
|
|
33
|
+
"kepler",
|
|
34
|
+
"lavoisier",
|
|
35
|
+
"lovelace",
|
|
36
|
+
"maxwell",
|
|
37
|
+
"mendel",
|
|
38
|
+
"newton",
|
|
39
|
+
"noether",
|
|
40
|
+
"oppenheimer",
|
|
41
|
+
"pasteur",
|
|
42
|
+
"pauli",
|
|
43
|
+
"planck",
|
|
44
|
+
"pythagoras",
|
|
45
|
+
"rutherford",
|
|
46
|
+
"sagan",
|
|
47
|
+
"turing",
|
|
48
|
+
"volterra",
|
|
49
|
+
// Composers
|
|
50
|
+
"bach",
|
|
51
|
+
"bartok",
|
|
52
|
+
"beethoven",
|
|
53
|
+
"brahms",
|
|
54
|
+
"chopin",
|
|
55
|
+
"debussy",
|
|
56
|
+
"dvorak",
|
|
57
|
+
"grieg",
|
|
58
|
+
"handel",
|
|
59
|
+
"haydn",
|
|
60
|
+
"liszt",
|
|
61
|
+
"mahler",
|
|
62
|
+
"monteverdi",
|
|
63
|
+
"mozart",
|
|
64
|
+
"prokofiev",
|
|
65
|
+
"purcell",
|
|
66
|
+
"ravel",
|
|
67
|
+
"satie",
|
|
68
|
+
"schubert",
|
|
69
|
+
"schumann",
|
|
70
|
+
"stravinsky",
|
|
71
|
+
"tchaikovsky",
|
|
72
|
+
"vivaldi",
|
|
73
|
+
"wagner",
|
|
74
|
+
// Philosophers & thinkers
|
|
75
|
+
"aquinas",
|
|
76
|
+
"aristotle",
|
|
77
|
+
"confucius",
|
|
78
|
+
"descartes",
|
|
79
|
+
"epicurus",
|
|
80
|
+
"hegel",
|
|
81
|
+
"hume",
|
|
82
|
+
"kant",
|
|
83
|
+
"kierkegaard",
|
|
84
|
+
"locke",
|
|
85
|
+
"machiavelli",
|
|
86
|
+
"nietzsche",
|
|
87
|
+
"plato",
|
|
88
|
+
"popper",
|
|
89
|
+
"rousseau",
|
|
90
|
+
"russell",
|
|
91
|
+
"seneca",
|
|
92
|
+
"socrates",
|
|
93
|
+
"spinoza",
|
|
94
|
+
"voltaire",
|
|
95
|
+
"wittgenstein",
|
|
96
|
+
"zeno",
|
|
97
|
+
// Writers (classic, globally recognizable)
|
|
98
|
+
"austen",
|
|
99
|
+
"borges",
|
|
100
|
+
"dickens",
|
|
101
|
+
"dostoevsky",
|
|
102
|
+
"homer",
|
|
103
|
+
"kafka",
|
|
104
|
+
"orwell",
|
|
105
|
+
"shakespeare",
|
|
106
|
+
"tolstoy",
|
|
107
|
+
"virgil",
|
|
108
|
+
"woolf",
|
|
109
|
+
// House vocabulary (design-studies / product fixtures)
|
|
110
|
+
"atlas",
|
|
111
|
+
"cobalt",
|
|
112
|
+
"drover",
|
|
113
|
+
"hudson",
|
|
114
|
+
"pike",
|
|
115
|
+
"quill",
|
|
116
|
+
];
|
|
117
|
+
export function normalizeProvisionalAgentNameCandidates(candidates) {
|
|
118
|
+
const seen = new Set();
|
|
119
|
+
const normalizedNames = [];
|
|
120
|
+
for (const raw of candidates) {
|
|
121
|
+
const withoutComment = raw.split("#")[0]?.trim() ?? "";
|
|
122
|
+
const withoutSigil = withoutComment.replace(/^@+/, "").trim();
|
|
123
|
+
const normalized = normalizeAgentSelectorSegment(withoutSigil);
|
|
124
|
+
if (!normalized || seen.has(normalized)) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
seen.add(normalized);
|
|
128
|
+
normalizedNames.push(normalized);
|
|
129
|
+
}
|
|
130
|
+
return normalizedNames;
|
|
131
|
+
}
|
|
132
|
+
export function parseProvisionalAgentNamesText(content) {
|
|
133
|
+
return normalizeProvisionalAgentNameCandidates(content.split(/\r?\n/u));
|
|
134
|
+
}
|
|
135
|
+
export function parseProvisionalAgentNamesJson(content) {
|
|
136
|
+
const parsed = JSON.parse(content);
|
|
137
|
+
if (Array.isArray(parsed)) {
|
|
138
|
+
return normalizeProvisionalAgentNameCandidates(parsed.filter((entry) => typeof entry === "string"));
|
|
139
|
+
}
|
|
140
|
+
if (parsed
|
|
141
|
+
&& typeof parsed === "object"
|
|
142
|
+
&& Array.isArray(parsed.names)) {
|
|
143
|
+
return normalizeProvisionalAgentNameCandidates(parsed.names.filter((entry) => typeof entry === "string"));
|
|
144
|
+
}
|
|
145
|
+
throw new Error("provisional agent names JSON must be a string array or { \"names\": [...] }");
|
|
146
|
+
}
|
|
147
|
+
export function isProvisionalAgentName(value, pool = PROVISIONAL_AGENT_NAMES) {
|
|
148
|
+
const normalized = normalizeAgentSelectorSegment(value);
|
|
149
|
+
return normalized.length > 0 && pool.includes(normalized);
|
|
150
|
+
}
|
|
151
|
+
/** Extract the base definition id from an agent id, handle, or @label. */
|
|
152
|
+
export function definitionIdFromOccupancyKey(value) {
|
|
153
|
+
const trimmed = value.trim().replace(/^@+/, "");
|
|
154
|
+
if (!trimmed) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const parsed = parseAgentIdentity(trimmed.startsWith("@") ? trimmed : `@${trimmed}`);
|
|
158
|
+
if (parsed?.definitionId) {
|
|
159
|
+
return normalizeAgentSelectorSegment(parsed.definitionId);
|
|
160
|
+
}
|
|
161
|
+
const head = trimmed.split(".")[0]?.trim() ?? "";
|
|
162
|
+
const normalized = normalizeAgentSelectorSegment(head);
|
|
163
|
+
return normalized || null;
|
|
164
|
+
}
|
|
165
|
+
export function collectOccupiedDefinitionIds(references) {
|
|
166
|
+
const occupied = new Set();
|
|
167
|
+
for (const reference of references) {
|
|
168
|
+
const definitionId = definitionIdFromOccupancyKey(reference);
|
|
169
|
+
if (definitionId) {
|
|
170
|
+
occupied.add(definitionId);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return occupied;
|
|
174
|
+
}
|
|
175
|
+
function updateFnv1a32(hash, value) {
|
|
176
|
+
let next = hash >>> 0;
|
|
177
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
178
|
+
next ^= value.charCodeAt(index);
|
|
179
|
+
next = Math.imul(next, 0x01000193) >>> 0;
|
|
180
|
+
}
|
|
181
|
+
return next;
|
|
182
|
+
}
|
|
183
|
+
export function provisionalAgentNameStartIndexForSeed(seedParts, pool = PROVISIONAL_AGENT_NAMES) {
|
|
184
|
+
if (pool.length === 0) {
|
|
185
|
+
return 0;
|
|
186
|
+
}
|
|
187
|
+
let hash = 0x811c9dc5;
|
|
188
|
+
let fieldIndex = 0;
|
|
189
|
+
for (const part of seedParts) {
|
|
190
|
+
const value = part == null ? "" : String(part);
|
|
191
|
+
hash = updateFnv1a32(hash, `${fieldIndex}:${value.length}:`);
|
|
192
|
+
hash = updateFnv1a32(hash, value);
|
|
193
|
+
hash = updateFnv1a32(hash, "|");
|
|
194
|
+
fieldIndex += 1;
|
|
195
|
+
}
|
|
196
|
+
hash = updateFnv1a32(hash, `fields:${fieldIndex}`);
|
|
197
|
+
return hash % pool.length;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Pick the next free name from the pool.
|
|
201
|
+
* Falls back to `{poolName}-{n}` only when the entire pool is occupied.
|
|
202
|
+
*/
|
|
203
|
+
export function allocateProvisionalAgentName(occupied, options = {}) {
|
|
204
|
+
const pool = options.pool?.length ? options.pool : PROVISIONAL_AGENT_NAMES;
|
|
205
|
+
if (pool.length === 0) {
|
|
206
|
+
throw new Error("provisional agent name pool is empty");
|
|
207
|
+
}
|
|
208
|
+
const taken = occupied instanceof Set
|
|
209
|
+
? occupied
|
|
210
|
+
: collectOccupiedDefinitionIds(occupied);
|
|
211
|
+
const start = Math.abs(options.startIndex ?? 0) % pool.length;
|
|
212
|
+
for (let offset = 0; offset < pool.length; offset += 1) {
|
|
213
|
+
const candidate = pool[(start + offset) % pool.length];
|
|
214
|
+
if (!taken.has(candidate)) {
|
|
215
|
+
return candidate;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const anchor = pool[start];
|
|
219
|
+
let suffix = 2;
|
|
220
|
+
while (taken.has(`${anchor}-${suffix}`)) {
|
|
221
|
+
suffix += 1;
|
|
222
|
+
}
|
|
223
|
+
return `${anchor}-${suffix}`;
|
|
224
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MetadataMap, ScoutId } from "./common.js";
|
|
2
|
+
export interface ConversationReadCursor {
|
|
3
|
+
conversationId: ScoutId;
|
|
4
|
+
actorId: ScoutId;
|
|
5
|
+
readerNodeId?: ScoutId;
|
|
6
|
+
lastReadMessageId?: ScoutId;
|
|
7
|
+
lastReadSeq?: number;
|
|
8
|
+
lastReadAt: number;
|
|
9
|
+
updatedAt: number;
|
|
10
|
+
metadata?: MetadataMap;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=read-receipts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-receipts.d.ts","sourceRoot":"","sources":["../src/read-receipts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -13,6 +13,14 @@ export interface RelayReturnAddress {
|
|
|
13
13
|
sessionId?: string;
|
|
14
14
|
metadata?: MetadataMap;
|
|
15
15
|
}
|
|
16
|
+
export interface RelayAgentCardLifecycle {
|
|
17
|
+
kind: "persistent" | "one_time";
|
|
18
|
+
createdAt?: number;
|
|
19
|
+
createdById?: ScoutId;
|
|
20
|
+
expiresAt?: number;
|
|
21
|
+
maxUses?: number;
|
|
22
|
+
inboxConversationId?: ScoutId;
|
|
23
|
+
}
|
|
16
24
|
export interface RelayAgentCard {
|
|
17
25
|
id: ScoutId;
|
|
18
26
|
agentId: ScoutId;
|
|
@@ -32,7 +40,9 @@ export interface RelayAgentCard {
|
|
|
32
40
|
createdById?: ScoutId;
|
|
33
41
|
brokerRegistered: boolean;
|
|
34
42
|
inboxConversationId?: ScoutId;
|
|
43
|
+
lifecycle?: RelayAgentCardLifecycle;
|
|
35
44
|
returnAddress: RelayReturnAddress;
|
|
36
45
|
metadata?: MetadataMap;
|
|
37
46
|
}
|
|
38
47
|
export declare function buildRelayReturnAddress(input: RelayReturnAddress): RelayReturnAddress;
|
|
48
|
+
//# sourceMappingURL=relay-agent-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-agent-card.d.ts","sourceRoot":"","sources":["../src/relay-agent-card.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,YAAY,GAAG,UAAU,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,aAAa,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,kBAAkB,GAAG,kBAAkB,CAiCrF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { ScoutId } from "./common.js";
|
|
2
|
+
export declare const SCOUT_RENDEZVOUS_GENERATED_CODENAME_LENGTH = 6;
|
|
3
|
+
export declare const SCOUT_RENDEZVOUS_CODENAME_MAX_LENGTH = 32;
|
|
4
|
+
export declare const SCOUT_RENDEZVOUS_INVITE_TTL_MS: number;
|
|
5
|
+
export declare const SCOUT_RENDEZVOUS_MAX_WAIT_MS: number;
|
|
6
|
+
export type ScoutRendezvousCreateRequest = {
|
|
7
|
+
action: "create";
|
|
8
|
+
codename?: string;
|
|
9
|
+
projectRoot: string;
|
|
10
|
+
participantId: ScoutId;
|
|
11
|
+
};
|
|
12
|
+
export type ScoutRendezvousJoinRequest = {
|
|
13
|
+
action: "join";
|
|
14
|
+
codename: string;
|
|
15
|
+
projectRoot: string;
|
|
16
|
+
participantId: ScoutId;
|
|
17
|
+
waitMs?: number;
|
|
18
|
+
};
|
|
19
|
+
export type ScoutRendezvousRequest = ScoutRendezvousCreateRequest | ScoutRendezvousJoinRequest;
|
|
20
|
+
export type ScoutRendezvousCreatedResponse = {
|
|
21
|
+
status: "created";
|
|
22
|
+
codename: string;
|
|
23
|
+
projectRoot: string;
|
|
24
|
+
participantId: ScoutId;
|
|
25
|
+
createdAt: number;
|
|
26
|
+
expiresAt: number;
|
|
27
|
+
};
|
|
28
|
+
export type ScoutRendezvousWaitingResponse = {
|
|
29
|
+
status: "waiting";
|
|
30
|
+
codename: string;
|
|
31
|
+
projectRoot: string;
|
|
32
|
+
participantId: ScoutId;
|
|
33
|
+
joinedAt: number;
|
|
34
|
+
expiresAt: number;
|
|
35
|
+
};
|
|
36
|
+
export type ScoutRendezvousMatchedResponse = {
|
|
37
|
+
status: "matched";
|
|
38
|
+
matchId: ScoutId;
|
|
39
|
+
codename: string;
|
|
40
|
+
projectRoot: string;
|
|
41
|
+
participantId: ScoutId;
|
|
42
|
+
participantIds: [ScoutId, ScoutId];
|
|
43
|
+
peerParticipantIds: ScoutId[];
|
|
44
|
+
createdAt: number;
|
|
45
|
+
expiresAt: number;
|
|
46
|
+
};
|
|
47
|
+
export type ScoutRendezvousCodenameBusyResponse = {
|
|
48
|
+
status: "codename_busy";
|
|
49
|
+
codename: string;
|
|
50
|
+
projectRoot: string;
|
|
51
|
+
participantId: ScoutId;
|
|
52
|
+
participantCount: number;
|
|
53
|
+
expiresAt: number;
|
|
54
|
+
suggestion: "choose_another_codename";
|
|
55
|
+
};
|
|
56
|
+
export type ScoutRendezvousNotFoundResponse = {
|
|
57
|
+
status: "not_found";
|
|
58
|
+
codename: string;
|
|
59
|
+
projectRoot: string;
|
|
60
|
+
participantId: ScoutId;
|
|
61
|
+
suggestion: "check_codename_or_create";
|
|
62
|
+
};
|
|
63
|
+
export type ScoutRendezvousExpiredResponse = {
|
|
64
|
+
status: "expired";
|
|
65
|
+
codename: string;
|
|
66
|
+
projectRoot: string;
|
|
67
|
+
participantId: ScoutId;
|
|
68
|
+
expiresAt: number;
|
|
69
|
+
suggestion: "choose_another_codename";
|
|
70
|
+
};
|
|
71
|
+
export type ScoutRendezvousConsumedResponse = {
|
|
72
|
+
status: "consumed";
|
|
73
|
+
codename: string;
|
|
74
|
+
projectRoot: string;
|
|
75
|
+
participantId: ScoutId;
|
|
76
|
+
expiresAt: number;
|
|
77
|
+
suggestion: "choose_another_codename";
|
|
78
|
+
};
|
|
79
|
+
export type ScoutRendezvousProjectMismatchResponse = {
|
|
80
|
+
status: "project_mismatch";
|
|
81
|
+
codename: string;
|
|
82
|
+
projectRoot: string;
|
|
83
|
+
participantId: ScoutId;
|
|
84
|
+
suggestion: "run_in_invitation_project";
|
|
85
|
+
};
|
|
86
|
+
export type ScoutRendezvousResponse = ScoutRendezvousCreatedResponse | ScoutRendezvousWaitingResponse | ScoutRendezvousMatchedResponse | ScoutRendezvousCodenameBusyResponse | ScoutRendezvousNotFoundResponse | ScoutRendezvousExpiredResponse | ScoutRendezvousConsumedResponse | ScoutRendezvousProjectMismatchResponse;
|
|
87
|
+
export type ScoutRendezvousFailureResponse = Extract<ScoutRendezvousResponse, {
|
|
88
|
+
status: "codename_busy" | "not_found" | "expired" | "consumed" | "project_mismatch";
|
|
89
|
+
}>;
|
|
90
|
+
export declare function isScoutRendezvousFailureResponse(response: ScoutRendezvousResponse): response is ScoutRendezvousFailureResponse;
|
|
91
|
+
export declare function normalizeScoutRendezvousCodename(codename: string): string;
|
|
92
|
+
/**
|
|
93
|
+
* Validates a human-chosen codename while retaining its display capitalization.
|
|
94
|
+
* Case folding is only for broker lookup keys.
|
|
95
|
+
*/
|
|
96
|
+
export declare function validateScoutRendezvousCodename(codename: unknown): string;
|
|
97
|
+
//# sourceMappingURL=rendezvous.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rendezvous.d.ts","sourceRoot":"","sources":["../src/rendezvous.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export const SCOUT_RENDEZVOUS_GENERATED_CODENAME_LENGTH = 6;
|
|
2
|
+
export const SCOUT_RENDEZVOUS_CODENAME_MAX_LENGTH = 32;
|
|
3
|
+
// Rooms stay joinable for hours so a human can relay the codename to the
|
|
4
|
+
// second session at their own pace; per-call long-polls stay short.
|
|
5
|
+
export const SCOUT_RENDEZVOUS_INVITE_TTL_MS = 4 * 60 * 60_000;
|
|
6
|
+
export const SCOUT_RENDEZVOUS_MAX_WAIT_MS = 10 * 60_000;
|
|
7
|
+
export function isScoutRendezvousFailureResponse(response) {
|
|
8
|
+
return response.status === "codename_busy"
|
|
9
|
+
|| response.status === "not_found"
|
|
10
|
+
|| response.status === "expired"
|
|
11
|
+
|| response.status === "consumed"
|
|
12
|
+
|| response.status === "project_mismatch";
|
|
13
|
+
}
|
|
14
|
+
export function normalizeScoutRendezvousCodename(codename) {
|
|
15
|
+
return codename.normalize("NFKC").trim().toLocaleUpperCase("en-US");
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Validates a human-chosen codename while retaining its display capitalization.
|
|
19
|
+
* Case folding is only for broker lookup keys.
|
|
20
|
+
*/
|
|
21
|
+
export function validateScoutRendezvousCodename(codename) {
|
|
22
|
+
if (typeof codename !== "string") {
|
|
23
|
+
throw new Error("codename must be a string");
|
|
24
|
+
}
|
|
25
|
+
const displayCodename = codename.normalize("NFKC").trim();
|
|
26
|
+
if (!displayCodename) {
|
|
27
|
+
throw new Error("codename must not be blank");
|
|
28
|
+
}
|
|
29
|
+
const normalized = normalizeScoutRendezvousCodename(displayCodename);
|
|
30
|
+
if (normalized.length > SCOUT_RENDEZVOUS_CODENAME_MAX_LENGTH
|
|
31
|
+
|| !/^[A-Z0-9]+$/u.test(normalized)) {
|
|
32
|
+
throw new Error(`codename must be 1 to ${SCOUT_RENDEZVOUS_CODENAME_MAX_LENGTH} ASCII letters or digits`);
|
|
33
|
+
}
|
|
34
|
+
return displayCodename;
|
|
35
|
+
}
|