@openscout/protocol 0.2.64 → 0.2.83
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 +35 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -2
- package/dist/invocations.d.ts +119 -4
- 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 +99 -4
- package/dist/scout-delivery.d.ts.map +1 -0
- package/dist/scout-dispatch.d.ts +40 -3
- package/dist/scout-dispatch.d.ts.map +1 -0
- package/dist/scout-reply-context.d.ts +1 -0
- package/dist/scout-reply-context.d.ts.map +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 +34 -2
- package/src/invocations.ts +351 -4
- 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 +113 -3
- package/src/scout-dispatch.ts +33 -2
- 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,90 @@
|
|
|
1
|
+
import type { MetadataMap, ScoutId } from "./common.js";
|
|
2
|
+
|
|
3
|
+
export type ObservedStatusPhase =
|
|
4
|
+
| "unconfigured"
|
|
5
|
+
| "registered"
|
|
6
|
+
| "starting"
|
|
7
|
+
| "connecting"
|
|
8
|
+
| "running"
|
|
9
|
+
| "stopping"
|
|
10
|
+
| "stopped"
|
|
11
|
+
| "closed"
|
|
12
|
+
| "error"
|
|
13
|
+
| "unknown";
|
|
14
|
+
|
|
15
|
+
export type ObservedActivity =
|
|
16
|
+
| "idle"
|
|
17
|
+
| "queued"
|
|
18
|
+
| "waking"
|
|
19
|
+
| "thinking"
|
|
20
|
+
| "executing"
|
|
21
|
+
| "working"
|
|
22
|
+
| "waiting_for_input"
|
|
23
|
+
| "waiting_on_actor"
|
|
24
|
+
| "blocked"
|
|
25
|
+
| "review"
|
|
26
|
+
| "completed"
|
|
27
|
+
| "failed"
|
|
28
|
+
| "cancelled"
|
|
29
|
+
| "stalled"
|
|
30
|
+
| "offline"
|
|
31
|
+
| "unknown";
|
|
32
|
+
|
|
33
|
+
export type ObservedStatusSubjectKind =
|
|
34
|
+
| "agent"
|
|
35
|
+
| "endpoint"
|
|
36
|
+
| "flight"
|
|
37
|
+
| "run"
|
|
38
|
+
| "question"
|
|
39
|
+
| "work_item"
|
|
40
|
+
| "pairing_runtime"
|
|
41
|
+
| "tail_session";
|
|
42
|
+
|
|
43
|
+
export type ObservedStatusProvenanceSource =
|
|
44
|
+
| "broker_record"
|
|
45
|
+
| "endpoint"
|
|
46
|
+
| "flight"
|
|
47
|
+
| "agent_run"
|
|
48
|
+
| "collaboration_record"
|
|
49
|
+
| "session_trace"
|
|
50
|
+
| "pairing_runtime"
|
|
51
|
+
| "tail_event"
|
|
52
|
+
| "process"
|
|
53
|
+
| "tmux"
|
|
54
|
+
| "staleness_inference";
|
|
55
|
+
|
|
56
|
+
export interface ObservedStatusDetail {
|
|
57
|
+
title?: string;
|
|
58
|
+
summary?: string;
|
|
59
|
+
toolName?: string;
|
|
60
|
+
waitingOn?: unknown;
|
|
61
|
+
sourceCursor?: string;
|
|
62
|
+
metadata?: MetadataMap;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface StatusProjectionProvenance {
|
|
66
|
+
source: ObservedStatusProvenanceSource;
|
|
67
|
+
refId: ScoutId;
|
|
68
|
+
observedAt: number;
|
|
69
|
+
confidence: number;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface ObservedStatusProjection {
|
|
73
|
+
subjectKind: ObservedStatusSubjectKind;
|
|
74
|
+
subjectId: ScoutId;
|
|
75
|
+
agentId?: ScoutId;
|
|
76
|
+
phase: ObservedStatusPhase;
|
|
77
|
+
activity: ObservedActivity;
|
|
78
|
+
detail?: ObservedStatusDetail;
|
|
79
|
+
provenance: StatusProjectionProvenance[];
|
|
80
|
+
confidence: number;
|
|
81
|
+
updatedAt: number;
|
|
82
|
+
staleAt?: number;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function observedStatusDisplay(status: Pick<ObservedStatusProjection, "phase" | "activity">): string {
|
|
86
|
+
if (status.phase === "running" && status.activity && status.activity !== "unknown") {
|
|
87
|
+
return status.activity;
|
|
88
|
+
}
|
|
89
|
+
return status.phase;
|
|
90
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
|
|
6
|
+
import {
|
|
7
|
+
SCOUT_MISSION_LOG_LIMITS,
|
|
8
|
+
SCOUT_ORCHESTRATOR_ROLE,
|
|
9
|
+
type ScoutRoleAssignment,
|
|
10
|
+
} from "./assigned-roles.js";
|
|
11
|
+
|
|
12
|
+
export function orchestratorSoftPrompt(opts: {
|
|
13
|
+
assignment: ScoutRoleAssignment;
|
|
14
|
+
missionId?: string;
|
|
15
|
+
}): string {
|
|
16
|
+
const missionLine =
|
|
17
|
+
opts.assignment.scope.kind === "mission"
|
|
18
|
+
? `Mission (work id): ${opts.assignment.scope.missionId}`
|
|
19
|
+
: opts.missionId
|
|
20
|
+
? `Active mission context: ${opts.missionId} (standing orchestrator assignment)`
|
|
21
|
+
: "Standing orchestrator: prefer mission-scoped assignment when a campaign exists.";
|
|
22
|
+
|
|
23
|
+
return [
|
|
24
|
+
`# Orchestrator role (assigned)`,
|
|
25
|
+
"",
|
|
26
|
+
`You are assigned the **${SCOUT_ORCHESTRATOR_ROLE.label}** role.`,
|
|
27
|
+
SCOUT_ORCHESTRATOR_ROLE.summary,
|
|
28
|
+
missionLine,
|
|
29
|
+
"",
|
|
30
|
+
"## Duties",
|
|
31
|
+
"- Own the mission spine: keep child work/asks linked under the campaign root.",
|
|
32
|
+
"- On mission moments (turn end, delegation, waiting, finish), append a short mission log entry.",
|
|
33
|
+
"- When blocked, set who holds the next move.",
|
|
34
|
+
"- Do not spam: only mission-level moments, not every tool call.",
|
|
35
|
+
"",
|
|
36
|
+
"## Mission log fields",
|
|
37
|
+
`- intent: stable goal (≤ ${SCOUT_MISSION_LOG_LIMITS.intentMaxWords} words)`,
|
|
38
|
+
`- status: current action (≤ ${SCOUT_MISSION_LOG_LIMITS.statusMaxWords} words)`,
|
|
39
|
+
`- kind: heartbeat | progress | delegation | waiting | decision | risk | integration | done | failed`,
|
|
40
|
+
`- note: optional, ≤ ${SCOUT_MISSION_LOG_LIMITS.noteMaxChars} chars`,
|
|
41
|
+
"",
|
|
42
|
+
"## How to write",
|
|
43
|
+
"- CLI: `scout role log-append <missionId> --actor <you> --kind progress --intent \"...\" --status \"...\"`",
|
|
44
|
+
"- HTTP: `POST /api/missions/<missionId>/log` with actorId, kind, intent, status",
|
|
45
|
+
"- Verbose chat stays in DMs; mission log is the cheap reconstruction stream.",
|
|
46
|
+
].join("\n");
|
|
47
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const SCOUT_PERMISSION_PROFILES = [
|
|
2
|
+
"observe",
|
|
3
|
+
"review",
|
|
4
|
+
"workspace_write",
|
|
5
|
+
"sandboxed_write",
|
|
6
|
+
"trusted_local",
|
|
7
|
+
"external_sandbox",
|
|
8
|
+
] as const;
|
|
9
|
+
|
|
10
|
+
export type ScoutPermissionProfile = typeof SCOUT_PERMISSION_PROFILES[number];
|
|
11
|
+
|
|
12
|
+
export function normalizeScoutPermissionProfile(
|
|
13
|
+
value: string | null | undefined,
|
|
14
|
+
): ScoutPermissionProfile | undefined {
|
|
15
|
+
const normalized = value?.trim().replaceAll("-", "_");
|
|
16
|
+
return SCOUT_PERMISSION_PROFILES.find((profile) => profile === normalized);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function formatScoutPermissionProfiles(): string {
|
|
20
|
+
return SCOUT_PERMISSION_PROFILES.join("|");
|
|
21
|
+
}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { normalizeAgentSelectorSegment, parseAgentIdentity } from "./agent-identity.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Curated rotation pool for provisional agent identities.
|
|
5
|
+
*
|
|
6
|
+
* Names are short, human-addressable, and collision-resistant across a local
|
|
7
|
+
* fleet. Categories include scientists, composers, philosophers, and a few
|
|
8
|
+
* literary figures — chosen for memorability, not biographical endorsement.
|
|
9
|
+
*/
|
|
10
|
+
export const PROVISIONAL_AGENT_NAMES = [
|
|
11
|
+
// Scientists & inventors
|
|
12
|
+
"archimedes",
|
|
13
|
+
"avogadro",
|
|
14
|
+
"bohr",
|
|
15
|
+
"boyle",
|
|
16
|
+
"copernicus",
|
|
17
|
+
"curie",
|
|
18
|
+
"dalton",
|
|
19
|
+
"darwin",
|
|
20
|
+
"dirac",
|
|
21
|
+
"einstein",
|
|
22
|
+
"euler",
|
|
23
|
+
"faraday",
|
|
24
|
+
"feynman",
|
|
25
|
+
"fermi",
|
|
26
|
+
"fourier",
|
|
27
|
+
"galileo",
|
|
28
|
+
"gauss",
|
|
29
|
+
"hawking",
|
|
30
|
+
"heisenberg",
|
|
31
|
+
"hooke",
|
|
32
|
+
"hopper",
|
|
33
|
+
"hypatia",
|
|
34
|
+
"kepler",
|
|
35
|
+
"lavoisier",
|
|
36
|
+
"lovelace",
|
|
37
|
+
"maxwell",
|
|
38
|
+
"mendel",
|
|
39
|
+
"newton",
|
|
40
|
+
"noether",
|
|
41
|
+
"oppenheimer",
|
|
42
|
+
"pasteur",
|
|
43
|
+
"pauli",
|
|
44
|
+
"planck",
|
|
45
|
+
"pythagoras",
|
|
46
|
+
"rutherford",
|
|
47
|
+
"sagan",
|
|
48
|
+
"turing",
|
|
49
|
+
"volterra",
|
|
50
|
+
// Composers
|
|
51
|
+
"bach",
|
|
52
|
+
"bartok",
|
|
53
|
+
"beethoven",
|
|
54
|
+
"brahms",
|
|
55
|
+
"chopin",
|
|
56
|
+
"debussy",
|
|
57
|
+
"dvorak",
|
|
58
|
+
"grieg",
|
|
59
|
+
"handel",
|
|
60
|
+
"haydn",
|
|
61
|
+
"liszt",
|
|
62
|
+
"mahler",
|
|
63
|
+
"monteverdi",
|
|
64
|
+
"mozart",
|
|
65
|
+
"prokofiev",
|
|
66
|
+
"purcell",
|
|
67
|
+
"ravel",
|
|
68
|
+
"satie",
|
|
69
|
+
"schubert",
|
|
70
|
+
"schumann",
|
|
71
|
+
"stravinsky",
|
|
72
|
+
"tchaikovsky",
|
|
73
|
+
"vivaldi",
|
|
74
|
+
"wagner",
|
|
75
|
+
// Philosophers & thinkers
|
|
76
|
+
"aquinas",
|
|
77
|
+
"aristotle",
|
|
78
|
+
"confucius",
|
|
79
|
+
"descartes",
|
|
80
|
+
"epicurus",
|
|
81
|
+
"hegel",
|
|
82
|
+
"hume",
|
|
83
|
+
"kant",
|
|
84
|
+
"kierkegaard",
|
|
85
|
+
"locke",
|
|
86
|
+
"machiavelli",
|
|
87
|
+
"nietzsche",
|
|
88
|
+
"plato",
|
|
89
|
+
"popper",
|
|
90
|
+
"rousseau",
|
|
91
|
+
"russell",
|
|
92
|
+
"seneca",
|
|
93
|
+
"socrates",
|
|
94
|
+
"spinoza",
|
|
95
|
+
"voltaire",
|
|
96
|
+
"wittgenstein",
|
|
97
|
+
"zeno",
|
|
98
|
+
// Writers (classic, globally recognizable)
|
|
99
|
+
"austen",
|
|
100
|
+
"borges",
|
|
101
|
+
"dickens",
|
|
102
|
+
"dostoevsky",
|
|
103
|
+
"homer",
|
|
104
|
+
"kafka",
|
|
105
|
+
"orwell",
|
|
106
|
+
"shakespeare",
|
|
107
|
+
"tolstoy",
|
|
108
|
+
"virgil",
|
|
109
|
+
"woolf",
|
|
110
|
+
// House vocabulary (design-studies / product fixtures)
|
|
111
|
+
"atlas",
|
|
112
|
+
"cobalt",
|
|
113
|
+
"drover",
|
|
114
|
+
"hudson",
|
|
115
|
+
"pike",
|
|
116
|
+
"quill",
|
|
117
|
+
] as const;
|
|
118
|
+
|
|
119
|
+
export type ProvisionalAgentName = (typeof PROVISIONAL_AGENT_NAMES)[number];
|
|
120
|
+
|
|
121
|
+
export function normalizeProvisionalAgentNameCandidates(
|
|
122
|
+
candidates: Iterable<string>,
|
|
123
|
+
): string[] {
|
|
124
|
+
const seen = new Set<string>();
|
|
125
|
+
const normalizedNames: string[] = [];
|
|
126
|
+
for (const raw of candidates) {
|
|
127
|
+
const withoutComment = raw.split("#")[0]?.trim() ?? "";
|
|
128
|
+
const withoutSigil = withoutComment.replace(/^@+/, "").trim();
|
|
129
|
+
const normalized = normalizeAgentSelectorSegment(withoutSigil);
|
|
130
|
+
if (!normalized || seen.has(normalized)) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
seen.add(normalized);
|
|
134
|
+
normalizedNames.push(normalized);
|
|
135
|
+
}
|
|
136
|
+
return normalizedNames;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function parseProvisionalAgentNamesText(content: string): string[] {
|
|
140
|
+
return normalizeProvisionalAgentNameCandidates(content.split(/\r?\n/u));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function parseProvisionalAgentNamesJson(content: string): string[] {
|
|
144
|
+
const parsed = JSON.parse(content) as unknown;
|
|
145
|
+
if (Array.isArray(parsed)) {
|
|
146
|
+
return normalizeProvisionalAgentNameCandidates(
|
|
147
|
+
parsed.filter((entry): entry is string => typeof entry === "string"),
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
if (
|
|
151
|
+
parsed
|
|
152
|
+
&& typeof parsed === "object"
|
|
153
|
+
&& Array.isArray((parsed as { names?: unknown }).names)
|
|
154
|
+
) {
|
|
155
|
+
return normalizeProvisionalAgentNameCandidates(
|
|
156
|
+
(parsed as { names: unknown[] }).names.filter(
|
|
157
|
+
(entry): entry is string => typeof entry === "string",
|
|
158
|
+
),
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
throw new Error(
|
|
162
|
+
"provisional agent names JSON must be a string array or { \"names\": [...] }",
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export function isProvisionalAgentName(
|
|
167
|
+
value: string,
|
|
168
|
+
pool: readonly string[] = PROVISIONAL_AGENT_NAMES,
|
|
169
|
+
): boolean {
|
|
170
|
+
const normalized = normalizeAgentSelectorSegment(value);
|
|
171
|
+
return normalized.length > 0 && pool.includes(normalized);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** Extract the base definition id from an agent id, handle, or @label. */
|
|
175
|
+
export function definitionIdFromOccupancyKey(value: string): string | null {
|
|
176
|
+
const trimmed = value.trim().replace(/^@+/, "");
|
|
177
|
+
if (!trimmed) {
|
|
178
|
+
return null;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const parsed = parseAgentIdentity(trimmed.startsWith("@") ? trimmed : `@${trimmed}`);
|
|
182
|
+
if (parsed?.definitionId) {
|
|
183
|
+
return normalizeAgentSelectorSegment(parsed.definitionId);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const head = trimmed.split(".")[0]?.trim() ?? "";
|
|
187
|
+
const normalized = normalizeAgentSelectorSegment(head);
|
|
188
|
+
return normalized || null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function collectOccupiedDefinitionIds(references: Iterable<string>): Set<string> {
|
|
192
|
+
const occupied = new Set<string>();
|
|
193
|
+
for (const reference of references) {
|
|
194
|
+
const definitionId = definitionIdFromOccupancyKey(reference);
|
|
195
|
+
if (definitionId) {
|
|
196
|
+
occupied.add(definitionId);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return occupied;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export type AllocateProvisionalAgentNameOptions = {
|
|
203
|
+
/** When set, allocation starts scanning from this pool index (wraps). */
|
|
204
|
+
startIndex?: number;
|
|
205
|
+
/** Override the built-in pool (for example operator-configured names). */
|
|
206
|
+
pool?: readonly string[];
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
export type ProvisionalAgentNameSeedPart = string | number | boolean | null | undefined;
|
|
210
|
+
|
|
211
|
+
function updateFnv1a32(hash: number, value: string): number {
|
|
212
|
+
let next = hash >>> 0;
|
|
213
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
214
|
+
next ^= value.charCodeAt(index);
|
|
215
|
+
next = Math.imul(next, 0x01000193) >>> 0;
|
|
216
|
+
}
|
|
217
|
+
return next;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export function provisionalAgentNameStartIndexForSeed(
|
|
221
|
+
seedParts: Iterable<ProvisionalAgentNameSeedPart>,
|
|
222
|
+
pool: readonly string[] = PROVISIONAL_AGENT_NAMES,
|
|
223
|
+
): number {
|
|
224
|
+
if (pool.length === 0) {
|
|
225
|
+
return 0;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
let hash = 0x811c9dc5;
|
|
229
|
+
let fieldIndex = 0;
|
|
230
|
+
for (const part of seedParts) {
|
|
231
|
+
const value = part == null ? "" : String(part);
|
|
232
|
+
hash = updateFnv1a32(hash, `${fieldIndex}:${value.length}:`);
|
|
233
|
+
hash = updateFnv1a32(hash, value);
|
|
234
|
+
hash = updateFnv1a32(hash, "|");
|
|
235
|
+
fieldIndex += 1;
|
|
236
|
+
}
|
|
237
|
+
hash = updateFnv1a32(hash, `fields:${fieldIndex}`);
|
|
238
|
+
return hash % pool.length;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Pick the next free name from the pool.
|
|
243
|
+
* Falls back to `{poolName}-{n}` only when the entire pool is occupied.
|
|
244
|
+
*/
|
|
245
|
+
export function allocateProvisionalAgentName(
|
|
246
|
+
occupied: ReadonlySet<string> | Iterable<string>,
|
|
247
|
+
options: AllocateProvisionalAgentNameOptions = {},
|
|
248
|
+
): string {
|
|
249
|
+
const pool = options.pool?.length ? options.pool : PROVISIONAL_AGENT_NAMES;
|
|
250
|
+
if (pool.length === 0) {
|
|
251
|
+
throw new Error("provisional agent name pool is empty");
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const taken = occupied instanceof Set
|
|
255
|
+
? occupied
|
|
256
|
+
: collectOccupiedDefinitionIds(occupied);
|
|
257
|
+
|
|
258
|
+
const start = Math.abs(options.startIndex ?? 0) % pool.length;
|
|
259
|
+
for (let offset = 0; offset < pool.length; offset += 1) {
|
|
260
|
+
const candidate = pool[(start + offset) % pool.length]!;
|
|
261
|
+
if (!taken.has(candidate)) {
|
|
262
|
+
return candidate;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
const anchor = pool[start]!;
|
|
267
|
+
let suffix = 2;
|
|
268
|
+
while (taken.has(`${anchor}-${suffix}`)) {
|
|
269
|
+
suffix += 1;
|
|
270
|
+
}
|
|
271
|
+
return `${anchor}-${suffix}`;
|
|
272
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MetadataMap, ScoutId } from "./common.js";
|
|
2
|
+
|
|
3
|
+
export interface ConversationReadCursor {
|
|
4
|
+
conversationId: ScoutId;
|
|
5
|
+
actorId: ScoutId;
|
|
6
|
+
readerNodeId?: ScoutId;
|
|
7
|
+
lastReadMessageId?: ScoutId;
|
|
8
|
+
lastReadSeq?: number;
|
|
9
|
+
lastReadAt: number;
|
|
10
|
+
updatedAt: number;
|
|
11
|
+
metadata?: MetadataMap;
|
|
12
|
+
}
|
package/src/relay-agent-card.ts
CHANGED
|
@@ -2,73 +2,83 @@ import type { AgentEndpoint, AgentHarness } from "./actors.js";
|
|
|
2
2
|
import type { MetadataMap, ScoutId } from "./common.js";
|
|
3
3
|
|
|
4
4
|
export interface RelayReturnAddress {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
5
|
+
actorId: ScoutId;
|
|
6
|
+
handle: string;
|
|
7
|
+
displayName?: string;
|
|
8
|
+
selector?: string;
|
|
9
|
+
defaultSelector?: string;
|
|
10
|
+
conversationId?: ScoutId;
|
|
11
|
+
replyToMessageId?: ScoutId;
|
|
12
|
+
nodeId?: ScoutId;
|
|
13
|
+
projectRoot?: string;
|
|
14
|
+
sessionId?: string;
|
|
15
|
+
metadata?: MetadataMap;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface RelayAgentCardLifecycle {
|
|
19
|
+
kind: "persistent" | "one_time";
|
|
20
|
+
createdAt?: number;
|
|
21
|
+
createdById?: ScoutId;
|
|
22
|
+
expiresAt?: number;
|
|
23
|
+
maxUses?: number;
|
|
24
|
+
inboxConversationId?: ScoutId;
|
|
16
25
|
}
|
|
17
26
|
|
|
18
27
|
export interface RelayAgentCard {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
28
|
+
id: ScoutId;
|
|
29
|
+
agentId: ScoutId;
|
|
30
|
+
definitionId: ScoutId;
|
|
31
|
+
displayName: string;
|
|
32
|
+
handle: string;
|
|
33
|
+
selector?: string;
|
|
34
|
+
defaultSelector?: string;
|
|
35
|
+
projectName?: string;
|
|
36
|
+
projectRoot: string;
|
|
37
|
+
currentDirectory: string;
|
|
38
|
+
harness: AgentHarness;
|
|
39
|
+
transport: AgentEndpoint["transport"];
|
|
40
|
+
sessionId?: string;
|
|
41
|
+
branch?: string;
|
|
42
|
+
createdAt: number;
|
|
43
|
+
createdById?: ScoutId;
|
|
44
|
+
brokerRegistered: boolean;
|
|
45
|
+
inboxConversationId?: ScoutId;
|
|
46
|
+
lifecycle?: RelayAgentCardLifecycle;
|
|
47
|
+
returnAddress: RelayReturnAddress;
|
|
48
|
+
metadata?: MetadataMap;
|
|
39
49
|
}
|
|
40
50
|
|
|
41
51
|
export function buildRelayReturnAddress(input: RelayReturnAddress): RelayReturnAddress {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
52
|
+
const next: RelayReturnAddress = {
|
|
53
|
+
actorId: input.actorId,
|
|
54
|
+
handle: input.handle.trim(),
|
|
55
|
+
};
|
|
56
|
+
if (input.displayName?.trim()) {
|
|
57
|
+
next.displayName = input.displayName.trim();
|
|
58
|
+
}
|
|
59
|
+
if (input.selector?.trim()) {
|
|
60
|
+
next.selector = input.selector.trim();
|
|
61
|
+
}
|
|
62
|
+
if (input.defaultSelector?.trim()) {
|
|
63
|
+
next.defaultSelector = input.defaultSelector.trim();
|
|
64
|
+
}
|
|
65
|
+
if (input.conversationId?.trim()) {
|
|
66
|
+
next.conversationId = input.conversationId.trim();
|
|
67
|
+
}
|
|
68
|
+
if (input.replyToMessageId?.trim()) {
|
|
69
|
+
next.replyToMessageId = input.replyToMessageId.trim();
|
|
70
|
+
}
|
|
71
|
+
if (input.nodeId?.trim()) {
|
|
72
|
+
next.nodeId = input.nodeId.trim();
|
|
73
|
+
}
|
|
74
|
+
if (input.projectRoot?.trim()) {
|
|
75
|
+
next.projectRoot = input.projectRoot.trim();
|
|
76
|
+
}
|
|
77
|
+
if (input.sessionId?.trim()) {
|
|
78
|
+
next.sessionId = input.sessionId.trim();
|
|
79
|
+
}
|
|
80
|
+
if (input.metadata && Object.keys(input.metadata).length > 0) {
|
|
81
|
+
next.metadata = input.metadata;
|
|
82
|
+
}
|
|
83
|
+
return next;
|
|
74
84
|
}
|