@stigmer/sdk 3.12.6 → 3.12.7

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.
Files changed (50) hide show
  1. package/__tests__/update-input-roundtrip.test.js +4 -0
  2. package/__tests__/update-input-roundtrip.test.js.map +1 -1
  3. package/execution/__tests__/transcript.test.d.ts +2 -0
  4. package/execution/__tests__/transcript.test.d.ts.map +1 -0
  5. package/execution/__tests__/transcript.test.js +527 -0
  6. package/execution/__tests__/transcript.test.js.map +1 -0
  7. package/execution/conversation-rules.d.ts +64 -0
  8. package/execution/conversation-rules.d.ts.map +1 -0
  9. package/execution/conversation-rules.js +113 -0
  10. package/execution/conversation-rules.js.map +1 -0
  11. package/execution/transcript.d.ts +171 -0
  12. package/execution/transcript.d.ts.map +1 -0
  13. package/execution/transcript.js +484 -0
  14. package/execution/transcript.js.map +1 -0
  15. package/gen/agentexecution.d.ts +11 -0
  16. package/gen/agentexecution.d.ts.map +1 -1
  17. package/gen/agentexecution.js +30 -1
  18. package/gen/agentexecution.js.map +1 -1
  19. package/gen/client.d.ts +5 -1
  20. package/gen/client.d.ts.map +1 -1
  21. package/gen/client.js +4 -0
  22. package/gen/client.js.map +1 -1
  23. package/gen/identityaccount.d.ts +1 -0
  24. package/gen/identityaccount.d.ts.map +1 -1
  25. package/gen/identityaccount.js +2 -0
  26. package/gen/identityaccount.js.map +1 -1
  27. package/gen/memory.d.ts +58 -0
  28. package/gen/memory.d.ts.map +1 -0
  29. package/gen/memory.js +143 -0
  30. package/gen/memory.js.map +1 -0
  31. package/gen/organization.d.ts +1 -0
  32. package/gen/organization.d.ts.map +1 -1
  33. package/gen/organization.js +2 -0
  34. package/gen/organization.js.map +1 -1
  35. package/index.d.ts +3 -0
  36. package/index.d.ts.map +1 -1
  37. package/index.js +3 -0
  38. package/index.js.map +1 -1
  39. package/package.json +2 -2
  40. package/src/__tests__/update-input-roundtrip.test.ts +4 -0
  41. package/src/execution/__tests__/transcript.golden.md +100 -0
  42. package/src/execution/__tests__/transcript.test.ts +627 -0
  43. package/src/execution/conversation-rules.ts +119 -0
  44. package/src/execution/transcript.ts +735 -0
  45. package/src/gen/agentexecution.ts +45 -1
  46. package/src/gen/client.ts +6 -1
  47. package/src/gen/identityaccount.ts +3 -0
  48. package/src/gen/memory.ts +164 -0
  49. package/src/gen/organization.ts +3 -0
  50. package/src/index.ts +28 -0
@@ -0,0 +1,113 @@
1
+ // Framework-agnostic conversation-assembly rules for every Stigmer surface.
2
+ //
3
+ // A session's conversation is reassembled from its AgentExecution list by
4
+ // several independent consumers: the React thread (@stigmer/react
5
+ // buildThreadItems / useSessionConversation), the CLI's session replay
6
+ // (snapshotToEvents), and the canonical transcript assembler (transcript.ts).
7
+ // Before this module each consumer carried its own copy of the same small
8
+ // rules, and the copies had already drifted (the CLI's replay lacks the
9
+ // Build-from-plan skip). These are the shared, canonical rules; presentation
10
+ // concerns (plan cards, todos anchoring, event interleaving) stay in the
11
+ // consumers.
12
+ //
13
+ // This module has no React or framework dependency so it can be shared by
14
+ // @stigmer/react, @stigmer/ink, and the CLI.
15
+ /**
16
+ * Returns the executions in chronological (oldest-first) order — the order a
17
+ * conversation reads top-to-bottom.
18
+ *
19
+ * Defense-in-depth against an unordered list response: the executions ARE the
20
+ * transcript, so a scrambled order drops the newest turns out of view (they no
21
+ * longer sort to the bottom). The server orders this list, but consumers must
22
+ * never depend on that alone. Resource ids are time-sortable ULIDs
23
+ * (`aex_01k…`), so an ascending id sort is creation order without parsing
24
+ * timestamps; entries missing an id sort last but keep a stable relative order.
25
+ */
26
+ export function sortChronologically(executions) {
27
+ return [...executions].sort((a, b) => {
28
+ const aId = a.metadata?.id ?? "";
29
+ const bId = b.metadata?.id ?? "";
30
+ if (aId === bId)
31
+ return 0;
32
+ if (!aId)
33
+ return 1;
34
+ if (!bId)
35
+ return -1;
36
+ return aId < bId ? -1 : 1;
37
+ });
38
+ }
39
+ /**
40
+ * Collects the ids of executions replaced via edit-and-resubmit.
41
+ *
42
+ * The successor execution carries `spec.supersedes_execution_id`; hiding the
43
+ * superseded turn makes the edited message read as a single corrected exchange
44
+ * (in-place replace). The raw execution list still contains superseded records
45
+ * — execution-history surfaces show them deliberately — so this is a
46
+ * conversation-view rule, applied by whoever renders or exports a
47
+ * conversation.
48
+ *
49
+ * @param extraSupersededId An id known only outside the list — the live stream
50
+ * copy's `supersedesExecutionId`: right after a resubmit, the successor
51
+ * streams before the list refetch delivers it.
52
+ */
53
+ export function supersededExecutionIds(executions, extraSupersededId) {
54
+ const ids = new Set();
55
+ for (const e of executions) {
56
+ const superseded = e.spec?.supersedesExecutionId;
57
+ if (superseded)
58
+ ids.add(superseded);
59
+ }
60
+ if (extraSupersededId)
61
+ ids.add(extraSupersededId);
62
+ return ids;
63
+ }
64
+ /**
65
+ * `true` when the execution is a Build-from-plan turn.
66
+ *
67
+ * Such a turn's `spec.message` is a machine-written label ("Build from
68
+ * plan"), not user prose — the real instruction is runner-injected from the
69
+ * same flag. Rendering or exporting the label as a user message would
70
+ * attribute words to the user they never typed; the plan the turn builds from
71
+ * is the visible cause.
72
+ */
73
+ export function isBuildFromPlanTurn(exec) {
74
+ return exec.spec?.executionConfig?.buildFromPlan === true;
75
+ }
76
+ /**
77
+ * The user prose that opens an execution's turn, or `null` when the turn has
78
+ * none.
79
+ *
80
+ * `spec.message` is the submitted prompt, but three shapes of it are not user
81
+ * prose and synthesize no user turn:
82
+ * - empty — nothing was typed (programmatic creates);
83
+ * - the literal `"execute"` — the legacy placeholder stamped on runs started
84
+ * without a message;
85
+ * - a Build-from-plan turn's machine-written label (see
86
+ * {@link isBuildFromPlanTurn}).
87
+ */
88
+ export function syntheticUserPrompt(exec) {
89
+ const specMessage = exec.spec?.message;
90
+ if (!specMessage || specMessage === "execute" || isBuildFromPlanTurn(exec)) {
91
+ return null;
92
+ }
93
+ return specMessage;
94
+ }
95
+ /**
96
+ * Extracts the execution id from an artifact storage key of the form
97
+ * `artifacts/{executionId}/...`. Returns `null` for an unexpected shape so the
98
+ * caller skips the fetch rather than issuing a request the server would
99
+ * reject.
100
+ *
101
+ * The fetch id must always derive from the key, never from render or export
102
+ * context: offloaded outputs inside a sub-agent's transcript are stored under
103
+ * the PARENT execution's id (the execution whose status was persisted), and
104
+ * the key is the record of that.
105
+ */
106
+ export function execIdFromStorageKey(storageKey) {
107
+ const parts = storageKey.split("/");
108
+ if (parts.length >= 3 && parts[0] === "artifacts" && parts[1]) {
109
+ return parts[1];
110
+ }
111
+ return null;
112
+ }
113
+ //# sourceMappingURL=conversation-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-rules.js","sourceRoot":"","sources":["../../src/execution/conversation-rules.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,EAAE;AACF,0EAA0E;AAC1E,kEAAkE;AAClE,uEAAuE;AACvE,8EAA8E;AAC9E,0EAA0E;AAC1E,wEAAwE;AACxE,6EAA6E;AAC7E,yEAAyE;AACzE,aAAa;AACb,EAAE;AACF,0EAA0E;AAC1E,6CAA6C;AAI7C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAqC;IAErC,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;QACjC,IAAI,GAAG,KAAK,GAAG;YAAE,OAAO,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,CAAC,CAAC;QACpB,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAqC,EACrC,iBAAiC;IAEjC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,EAAE,qBAAqB,CAAC;QACjD,IAAI,UAAU;YAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,iBAAiB;QAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAoB;IACtD,OAAO,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,aAAa,KAAK,IAAI,CAAC;AAC5D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAoB;IACtD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;IACvC,IAAI,CAAC,WAAW,IAAI,WAAW,KAAK,SAAS,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,UAAkB;IACrD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,171 @@
1
+ import { type JsonValue } from "@bufbuild/protobuf";
2
+ import type { AgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
3
+ import type { GetArtifactContentResponse, ListAgentExecutionsBySessionRequest, AgentExecutionList, GetArtifactContentRequest } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/io_pb";
4
+ import type { Session } from "@stigmer/protos/ai/stigmer/agentic/session/v1/api_pb";
5
+ /**
6
+ * The fetched content of one offloaded tool output
7
+ * ({@link ToolCallOutputRef}), keyed in the transcript by its storage key —
8
+ * the one identifier that is unique across executions and sub-agents.
9
+ */
10
+ export interface ResolvedToolOutput {
11
+ /** The `output_ref.storage_key` this content belongs to. */
12
+ readonly storageKey: string;
13
+ /**
14
+ * The resolved text, possibly truncated at the server's content cap
15
+ * (512 KB by default). `undefined` when the fetch failed or was skipped —
16
+ * serializers fall back to the ref's `truncated_preview`.
17
+ */
18
+ readonly content?: string;
19
+ /** `true` when the server truncated {@link content} at the byte cap. */
20
+ readonly truncated: boolean;
21
+ /** Full stored size in bytes, when known. */
22
+ readonly totalSizeBytes?: number;
23
+ /** MIME type recorded on the ref. */
24
+ readonly mimeType: string;
25
+ /** `true` for image outputs — never inlined; serializers note them. */
26
+ readonly isImage: boolean;
27
+ /** Fetch failure, when resolution was attempted and failed. */
28
+ readonly error?: string;
29
+ }
30
+ /** One execution's contribution to the conversation, with the canonical
31
+ * rules' verdicts precomputed so consumers never re-derive them. */
32
+ export interface TranscriptTurn {
33
+ /** The execution, verbatim — messages, tool calls, sub-agents, timestamps. */
34
+ readonly execution: AgentExecution;
35
+ /**
36
+ * The user prose that opened this turn, or `null` when the turn has none
37
+ * (programmatic create, `"execute"` placeholder, Build-from-plan label) —
38
+ * the shared `syntheticUserPrompt` rule.
39
+ */
40
+ readonly userPrompt: string | null;
41
+ /** `true` for a Build-from-plan turn (machine-labeled, no user prose). */
42
+ readonly isBuildFromPlan: boolean;
43
+ /** `true` when the turn was replaced by an edit-and-resubmit. Only ever
44
+ * `true` when the transcript was assembled with `includeSuperseded`. */
45
+ readonly superseded: boolean;
46
+ /** `true` when the execution had not reached a terminal phase at assembly
47
+ * time — its content is the last-persisted snapshot of a running turn. */
48
+ readonly inProgress: boolean;
49
+ }
50
+ /** The canonical whole-conversation record of one session. */
51
+ export interface SessionTranscript {
52
+ /** The session, verbatim. */
53
+ readonly session: Session;
54
+ /** The conversation's turns, in chronological (ULID) order. */
55
+ readonly turns: readonly TranscriptTurn[];
56
+ /**
57
+ * Fetched offloaded tool outputs, keyed by storage key. Empty when
58
+ * resolution was skipped; serializers then fall back to each ref's
59
+ * `truncated_preview`.
60
+ */
61
+ readonly resolvedOutputs: Readonly<Record<string, ResolvedToolOutput>>;
62
+ /** Whether superseded (edit-and-resubmit) turns were kept. */
63
+ readonly includesSuperseded: boolean;
64
+ }
65
+ /** Options for {@link assembleSessionTranscript}. */
66
+ export interface AssembleSessionTranscriptOptions {
67
+ /**
68
+ * Keep turns replaced by edit-and-resubmit, marked
69
+ * `superseded: true`. Defaults to `false` — the conversation as the
70
+ * viewer shows it.
71
+ */
72
+ readonly includeSuperseded?: boolean;
73
+ /** Fetched offloaded outputs to embed (see {@link resolveOffloadedOutputs}). */
74
+ readonly resolvedOutputs?: Readonly<Record<string, ResolvedToolOutput>>;
75
+ }
76
+ /**
77
+ * Assembles the canonical transcript from a session and its executions.
78
+ *
79
+ * Pure — same inputs, same transcript. Ordering, superseded filtering, and
80
+ * user-turn synthesis are the shared conversation rules from
81
+ * `conversation-rules.ts`, so this cannot drift from what the conversation
82
+ * view renders.
83
+ */
84
+ export declare function assembleSessionTranscript(session: Session, executions: readonly AgentExecution[], options?: AssembleSessionTranscriptOptions): SessionTranscript;
85
+ /**
86
+ * The client slice {@link fetchSessionTranscript} needs — structurally
87
+ * satisfied by the `Stigmer` client, and small enough to fake in tests and
88
+ * satisfy from any host.
89
+ */
90
+ export interface SessionTranscriptClient {
91
+ readonly session: {
92
+ get(id: string): Promise<Session>;
93
+ };
94
+ readonly agentExecution: {
95
+ listBySession(input: ListAgentExecutionsBySessionRequest): Promise<AgentExecutionList>;
96
+ getArtifactContent(input: GetArtifactContentRequest): Promise<GetArtifactContentResponse>;
97
+ };
98
+ }
99
+ /** Options for {@link fetchSessionTranscript}. */
100
+ export interface FetchSessionTranscriptOptions {
101
+ /** See {@link AssembleSessionTranscriptOptions.includeSuperseded}. */
102
+ readonly includeSuperseded?: boolean;
103
+ /**
104
+ * Fetch offloaded tool outputs (`output_ref`) so the transcript carries
105
+ * them in full instead of their truncated previews. Defaults to `true` —
106
+ * resolution is the fidelity bar of #814. Individual fetch failures never
107
+ * fail the export; the failed ref falls back to its preview, with the
108
+ * error recorded on its {@link ResolvedToolOutput}.
109
+ */
110
+ readonly resolveOutputs?: boolean;
111
+ /** Concurrent output fetches. Defaults to 4. */
112
+ readonly concurrency?: number;
113
+ }
114
+ /**
115
+ * Fetches everything a session's transcript needs and assembles it.
116
+ *
117
+ * One `listBySession` call returns the complete execution set — both server
118
+ * editions answer this RPC unpaginated today (Go: `TODO: Implement
119
+ * pagination`; Java: "not using pagination with authorized IDs approach").
120
+ * If a future server starts paginating (`total_pages > 1`), this fails with
121
+ * a descriptive error rather than silently exporting a truncated
122
+ * "full-fidelity" transcript.
123
+ */
124
+ export declare function fetchSessionTranscript(client: SessionTranscriptClient, sessionId: string, options?: FetchSessionTranscriptOptions): Promise<SessionTranscript>;
125
+ /**
126
+ * Fetches the content behind every offloaded tool output in the given
127
+ * executions (parent and sub-agent transcripts alike), keyed by storage key.
128
+ *
129
+ * Image refs are never fetched — serializers render them as notes. The
130
+ * execution id for each fetch derives from the storage key itself
131
+ * (`execIdFromStorageKey`): sub-agent outputs are stored under the PARENT
132
+ * execution's id, and the key is the record of that.
133
+ */
134
+ export declare function resolveOffloadedOutputs(client: Pick<SessionTranscriptClient, "agentExecution">, executions: readonly AgentExecution[], options?: {
135
+ readonly concurrency?: number;
136
+ }): Promise<Record<string, ResolvedToolOutput>>;
137
+ /** Options for {@link transcriptToMarkdown}. */
138
+ export interface TranscriptToMarkdownOptions {
139
+ /**
140
+ * ISO timestamp stamped in the document header as the export time.
141
+ * Omitted when not provided, keeping the serializer deterministic for
142
+ * fixture pinning.
143
+ */
144
+ readonly generatedAt?: string;
145
+ }
146
+ /**
147
+ * Renders the transcript as a self-contained Markdown document.
148
+ *
149
+ * Deterministic: same transcript, same bytes — the format is a pinned
150
+ * contract (see `__tests__/transcript.test.ts`). Roles are bold labels
151
+ * (User / Assistant / Thinking / System), thinking and system content is
152
+ * blockquoted, tool calls carry fenced args and output, and sub-agent turns
153
+ * are blockquoted sections. Fences self-size past any backtick runs in the
154
+ * content, so hostile content cannot break out of its block.
155
+ */
156
+ export declare function transcriptToMarkdown(transcript: SessionTranscript, options?: TranscriptToMarkdownOptions): string;
157
+ /**
158
+ * Renders the transcript as a plain JSON value for programmatic analysis.
159
+ *
160
+ * Proto parts serialize through `toJson` with `useProtoFieldName: true` —
161
+ * the platform-wide protojson parity contract (snake_case fields, int64 as
162
+ * strings, `fromJson` round-trippable). Never `JSON.stringify` a raw proto
163
+ * object here: int64 fields are `bigint` and would throw.
164
+ *
165
+ * One deliberate omission: `status.callback_token` is stripped. It is an
166
+ * internal Temporal task token (runtime plumbing for workflow-triggered
167
+ * executions), not conversation material, and has no place in a document
168
+ * users share and paste around.
169
+ */
170
+ export declare function transcriptToJson(transcript: SessionTranscript): JsonValue;
171
+ //# sourceMappingURL=transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../src/execution/transcript.ts"],"names":[],"mappings":"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"}