@botiverse/oar 0.20.5 → 0.21.1

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 (58) hide show
  1. package/README.md +5 -3
  2. package/assets/brands/NOTICE.md +2 -0
  3. package/assets/brands/morph-on-dark.svg +9 -0
  4. package/assets/brands/morph-on-light.svg +9 -0
  5. package/assets/brands/morph.svg +9 -0
  6. package/dist/agents/crew.js +1 -1
  7. package/dist/agents/crew.js.map +1 -1
  8. package/dist/community/index.d.ts +2 -0
  9. package/dist/community/index.d.ts.map +1 -0
  10. package/dist/community/index.js +8 -0
  11. package/dist/community/index.js.map +1 -0
  12. package/dist/community/morph/console.d.ts +54 -0
  13. package/dist/community/morph/console.d.ts.map +1 -0
  14. package/dist/community/morph/console.js +237 -0
  15. package/dist/community/morph/console.js.map +1 -0
  16. package/dist/community/morph/index.d.ts +15 -0
  17. package/dist/community/morph/index.d.ts.map +1 -0
  18. package/dist/community/morph/index.js +31 -0
  19. package/dist/community/morph/index.js.map +1 -0
  20. package/dist/community/morph/installation.d.ts +4 -0
  21. package/dist/community/morph/installation.d.ts.map +1 -0
  22. package/dist/community/morph/installation.js +14 -0
  23. package/dist/community/morph/installation.js.map +1 -0
  24. package/dist/community/morph/list-models.d.ts +9 -0
  25. package/dist/community/morph/list-models.d.ts.map +1 -0
  26. package/dist/community/morph/list-models.js +34 -0
  27. package/dist/community/morph/list-models.js.map +1 -0
  28. package/dist/community/morph/projection.d.ts +36 -0
  29. package/dist/community/morph/projection.d.ts.map +1 -0
  30. package/dist/community/morph/projection.js +210 -0
  31. package/dist/community/morph/projection.js.map +1 -0
  32. package/dist/community/morph/session.d.ts +9 -0
  33. package/dist/community/morph/session.d.ts.map +1 -0
  34. package/dist/community/morph/session.js +220 -0
  35. package/dist/community/morph/session.js.map +1 -0
  36. package/dist/community/morph/topic.d.ts +24 -0
  37. package/dist/community/morph/topic.d.ts.map +1 -0
  38. package/dist/community/morph/topic.js +74 -0
  39. package/dist/community/morph/topic.js.map +1 -0
  40. package/dist/community/morph/tracker.d.ts +33 -0
  41. package/dist/community/morph/tracker.d.ts.map +1 -0
  42. package/dist/community/morph/tracker.js +157 -0
  43. package/dist/community/morph/tracker.js.map +1 -0
  44. package/dist/index.d.ts +2 -2
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +2 -2
  47. package/dist/index.js.map +1 -1
  48. package/dist/observe/app-requests.d.ts +20 -0
  49. package/dist/observe/app-requests.d.ts.map +1 -0
  50. package/dist/observe/app-requests.js +41 -0
  51. package/dist/observe/app-requests.js.map +1 -0
  52. package/dist/observe/index.d.ts +2 -0
  53. package/dist/observe/index.d.ts.map +1 -1
  54. package/dist/observe/index.js +1 -0
  55. package/dist/observe/index.js.map +1 -1
  56. package/dist/runtimes/cursor/index.d.ts +3 -3
  57. package/dist/runtimes/cursor/index.js +3 -3
  58. package/package.json +5 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-models.js","sourceRoot":"","sources":["../../../src/community/morph/list-models.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7D;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,KAAK,MAAM,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;QAClF,IAAI,OAAO,OAAO,EAAE,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,KAAK,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAClH,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,OAAO,CAAC,IAAI;YAChB,GAAG,CAAC,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpG,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAgB,KAAK,EAAE,YAAY,EAA6B,EAAE;IAC5F,IAAI,YAAY,CAAC,GAAG,KAAK,YAAY,EAAE,CAAC;QACtC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,0EAA0E,EAAE,CAAC;IACrH,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC;IACvG,CAAC;YAAS,CAAC;QACT,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { RuntimeEventBody } from "../../contracts/session.js";
2
+ export interface MorphTaskProjection {
3
+ /** Highest trace entry seq already read. */
4
+ readonly traceSeq: number;
5
+ /** The assistant text read so far for the current message. */
6
+ readonly text: string;
7
+ /** Counts messages, so a rewritten snapshot starts a new `messageId`. */
8
+ readonly message: number;
9
+ readonly reasoning: string;
10
+ /** Tool calls started and not ended, newest last: `tool_output` names only the tool. */
11
+ readonly openCalls: readonly {
12
+ readonly callId: string;
13
+ readonly tool: string;
14
+ }[];
15
+ }
16
+ export interface MorphProjection {
17
+ readonly model: string | null;
18
+ readonly tasks: Readonly<Record<string, MorphTaskProjection>>;
19
+ }
20
+ export declare const initialMorphProjection: MorphProjection;
21
+ export declare const TERMINAL_TASK_STATUSES: ReadonlySet<string>;
22
+ export interface MorphFold {
23
+ readonly state: MorphProjection;
24
+ readonly events: readonly RuntimeEventBody[];
25
+ }
26
+ /** What one `/stream/ws` snapshot adds. Never a turn end: the stream's `done` is a hint, the task query decides. */
27
+ export declare function foldMorphStream(state: MorphProjection, frame: unknown): MorphFold;
28
+ /**
29
+ * What a `GET /tasks/{id}` answer adds. A terminal one reads whatever trace,
30
+ * reasoning and answer the stream did not deliver, then the turn end; any
31
+ * other status adds nothing (its frame still enters the stream).
32
+ */
33
+ export declare function foldMorphTask(state: MorphProjection, info: unknown): MorphFold;
34
+ /** The topic's context fullness from `GET /topic/{id}/metadata`, when Console has measured it. */
35
+ export declare function morphContextEvents(metadata: unknown): readonly RuntimeEventBody[];
36
+ //# sourceMappingURL=projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../../../src/community/morph/projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,4BAA4B,CAAC;AAoBhF,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,SAAS;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACnF;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;CAC/D;AAED,eAAO,MAAM,sBAAsB,EAAE,eAA4C,CAAC;AAIlF,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAA2C,CAAC;AAEnG,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC9C;AA4ID,oHAAoH;AACpH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,CAgBjF;AAqBD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,GAAG,SAAS,CAoB9E;AAED,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,gBAAgB,EAAE,CAYjF"}
@@ -0,0 +1,210 @@
1
+ import { classifyFailure } from "../../shared/failure-class.js";
2
+ import { asNumber, asRecord, asRecordList } from "../../shared/json.js";
3
+ export const initialMorphProjection = { model: null, tasks: {} };
4
+ const initialTask = { traceSeq: 0, text: "", message: 0, reasoning: "", openCalls: [] };
5
+ export const TERMINAL_TASK_STATUSES = new Set(["done", "failed", "canceled"]);
6
+ function text(value) {
7
+ return typeof value === "string" && value !== "" ? value : undefined;
8
+ }
9
+ /** A tool's arguments as one readable line: a lone command string as is, otherwise JSON. */
10
+ function describeArgs(args) {
11
+ if (args === null || Object.keys(args).length === 0) {
12
+ return undefined;
13
+ }
14
+ const command = args.cmd ?? args.command;
15
+ return typeof command === "string" && Object.keys(args).length === 1 ? command : JSON.stringify(args);
16
+ }
17
+ /** "Request failed: ... Retrying in 1.0s (1/5)." */
18
+ function retryEvent(reason) {
19
+ const count = /\((\d+)\/(\d+)\)/u.exec(reason);
20
+ if (count === null) {
21
+ return null;
22
+ }
23
+ const delay = /in (\d+(?:\.\d+)?)(ms|s)\b/u.exec(reason);
24
+ return {
25
+ kind: "retry",
26
+ attempt: Number(count[1]),
27
+ maxAttempts: Number(count[2]),
28
+ ...(delay === null ? {} : { delayMs: Math.round(Number(delay[1]) * (delay[2] === "s" ? 1000 : 1)) }),
29
+ reason,
30
+ };
31
+ }
32
+ function modelEvents(state, model) {
33
+ const name = text(model);
34
+ return name === undefined || name === state.model
35
+ ? { state, events: [] }
36
+ : { state: { ...state, model: name }, events: [{ kind: "model", model: name }] };
37
+ }
38
+ /** One agent event (mistermorph agent/events.go) as OAR events. */
39
+ function traceEvent(task, taskId, seq, event) {
40
+ const tool = text(event.tool_name) ?? "tool";
41
+ switch (event.kind) {
42
+ case "tool_start": {
43
+ const callId = text(event.activity_id) ?? `${taskId}:${String(seq)}`;
44
+ const input = describeArgs(asRecord(event.args));
45
+ return {
46
+ task: { ...task, openCalls: [...task.openCalls, { callId, tool }] },
47
+ events: [{ kind: "tool_call_started", callId, tool, ...(input === undefined ? {} : { input }) }],
48
+ };
49
+ }
50
+ case "tool_output": {
51
+ const open = task.openCalls.findLast((call) => call.tool === tool);
52
+ const output = text(event.text);
53
+ return { task, events: open === undefined ? [] : [{ kind: "tool_call_progress", callId: open.callId, ...(output === undefined ? {} : { output }) }] };
54
+ }
55
+ case "tool_done": {
56
+ const callId = text(event.activity_id) ?? task.openCalls.findLast((call) => call.tool === tool)?.callId ?? `${taskId}:${String(seq)}`;
57
+ const output = text(event.text);
58
+ const exit = output === undefined ? null : /^exit_code: (-?\d+)/u.exec(output);
59
+ const failed = text(event.error) !== undefined || event.status === "failed" || event.status === "error";
60
+ const result = failed ? "failed" : (event.status === "done" ? "ok" : undefined);
61
+ return {
62
+ task: { ...task, openCalls: task.openCalls.filter((call) => call.callId !== callId) },
63
+ events: [{
64
+ kind: "tool_call_ended",
65
+ callId,
66
+ ...(output === undefined ? {} : { content: [{ type: "text", text: output }] }),
67
+ ...(result === undefined ? {} : { result }),
68
+ ...(exit === null ? {} : { exitCode: Number(exit[1]) }),
69
+ }],
70
+ };
71
+ }
72
+ case "llm_retry": {
73
+ const retry = retryEvent(text(event.text) ?? "");
74
+ return { task, events: retry === null ? [] : [retry] };
75
+ }
76
+ case "context_compaction_start": {
77
+ const trigger = text(event.reason);
78
+ return { task, events: [{ kind: "compaction_started", ...(trigger === undefined ? {} : { trigger }) }] };
79
+ }
80
+ case "context_compaction_done":
81
+ return { task, events: [{ kind: "compaction_ended", outcome: "completed" }] };
82
+ case "context_compaction_failed": {
83
+ const reason = text(event.error) ?? text(event.reason);
84
+ return { task, events: [{ kind: "compaction_ended", outcome: "failed", ...(reason === undefined ? {} : { reason }) }] };
85
+ }
86
+ case "steer_applied": {
87
+ // The steer text entering the conversation; morph names no input id.
88
+ const input = text(event.text);
89
+ return { task, events: input === undefined ? [] : [{ kind: "user_message", input, evidence: "conversation" }] };
90
+ }
91
+ default:
92
+ return { task, events: [] };
93
+ }
94
+ }
95
+ function readTrace(state, taskId, task, trace) {
96
+ let current = task;
97
+ let projection = state;
98
+ const events = [];
99
+ for (const entry of asRecordList(asRecord(trace)?.entries)) {
100
+ const seq = asNumber(entry.seq);
101
+ const event = asRecord(entry.event);
102
+ if (seq === null || event === null || seq <= current.traceSeq) {
103
+ continue;
104
+ }
105
+ const model = modelEvents(projection, event.model);
106
+ projection = model.state;
107
+ events.push(...model.events);
108
+ const read = traceEvent(current, taskId, seq, event);
109
+ current = { ...read.task, traceSeq: seq };
110
+ events.push(...read.events);
111
+ }
112
+ return { state: projection, task: current, events };
113
+ }
114
+ /** The part of a snapshot not yet read: the tail when it extends what was read, the whole of it as a new message otherwise. */
115
+ function readText(task, taskId, snapshot) {
116
+ if (snapshot === task.text || snapshot === "") {
117
+ return { task, events: [] };
118
+ }
119
+ if (snapshot.startsWith(task.text)) {
120
+ return { task: { ...task, text: snapshot }, events: [{ kind: "text_delta", text: snapshot.slice(task.text.length), messageId: `${taskId}:${String(task.message)}` }] };
121
+ }
122
+ const message = task.text === "" ? task.message : task.message + 1;
123
+ return { task: { ...task, text: snapshot, message }, events: [{ kind: "text_delta", text: snapshot, messageId: `${taskId}:${String(message)}` }] };
124
+ }
125
+ function readReasoning(task, snapshot) {
126
+ if (snapshot === "" || snapshot === task.reasoning) {
127
+ return { task, events: [] };
128
+ }
129
+ const piece = snapshot.startsWith(task.reasoning) ? snapshot.slice(task.reasoning.length) : snapshot;
130
+ return { task: { ...task, reasoning: snapshot }, events: [{ kind: "reasoning", content: { kind: "text", text: piece } }] };
131
+ }
132
+ function withTask(state, taskId, task) {
133
+ return { ...state, tasks: { ...state.tasks, [taskId]: task } };
134
+ }
135
+ /** What one `/stream/ws` snapshot adds. Never a turn end: the stream's `done` is a hint, the task query decides. */
136
+ export function foldMorphStream(state, frame) {
137
+ const record = asRecord(frame);
138
+ const taskId = text(record?.task_id);
139
+ if (record === null || taskId === undefined) {
140
+ return { state, events: [] };
141
+ }
142
+ const trace = readTrace(state, taskId, state.tasks[taskId] ?? initialTask, record.trace);
143
+ const reasoning = readReasoning(trace.task, text(record.reasoning) ?? "");
144
+ // A preview is Console's tool status line; a failed or canceled snapshot
145
+ // carries the error as its text ("stopped by user", observed 2026-10-04).
146
+ const errored = record.status === "failed" || record.status === "canceled" || text(record.error) !== undefined;
147
+ const said = record.preview === true || errored ? { task: reasoning.task, events: [] } : readText(reasoning.task, taskId, text(record.text) ?? "");
148
+ return {
149
+ state: withTask(trace.state, taskId, said.task),
150
+ events: [...trace.events, ...reasoning.events, ...said.events],
151
+ };
152
+ }
153
+ function outcomeOf(info) {
154
+ if (info.status === "done") {
155
+ return { kind: "completed" };
156
+ }
157
+ if (info.status === "canceled") {
158
+ return { kind: "aborted" };
159
+ }
160
+ const reason = text(info.error) ?? "morph task failed";
161
+ return { kind: "failed", reason, failure: classifyFailure(reason) };
162
+ }
163
+ function finalOutput(result) {
164
+ const output = asRecord(result?.final)?.output;
165
+ if (output === undefined || output === null) {
166
+ return undefined;
167
+ }
168
+ return typeof output === "string" ? text(output) : JSON.stringify(output);
169
+ }
170
+ /**
171
+ * What a `GET /tasks/{id}` answer adds. A terminal one reads whatever trace,
172
+ * reasoning and answer the stream did not deliver, then the turn end; any
173
+ * other status adds nothing (its frame still enters the stream).
174
+ */
175
+ export function foldMorphTask(state, info) {
176
+ const record = asRecord(info);
177
+ const taskId = text(record?.id);
178
+ if (record === null || taskId === undefined || typeof record.status !== "string" || !TERMINAL_TASK_STATUSES.has(record.status)) {
179
+ return { state, events: [] };
180
+ }
181
+ const result = asRecord(record.result);
182
+ const model = modelEvents(state, record.model);
183
+ const trace = readTrace(model.state, taskId, state.tasks[taskId] ?? initialTask, result?.trace);
184
+ const reasoning = readReasoning(trace.task, text(result?.reasoning) ?? "");
185
+ // Only a finished task's output is the agent's answer: a canceled or failed
186
+ // one carries the error there ("stopped by user"), which the turn end reports.
187
+ const answer = record.status === "done" ? finalOutput(result) : undefined;
188
+ const said = answer === undefined ? { task: reasoning.task, events: [] } : readText(reasoning.task, taskId, answer);
189
+ const tasks = { ...trace.state.tasks };
190
+ delete tasks[taskId];
191
+ return {
192
+ state: { ...trace.state, tasks },
193
+ events: [...model.events, ...trace.events, ...reasoning.events, ...said.events, { kind: "turn_ended", outcome: outcomeOf(record) }],
194
+ };
195
+ }
196
+ /** The topic's context fullness from `GET /topic/{id}/metadata`, when Console has measured it. */
197
+ export function morphContextEvents(metadata) {
198
+ const context = asRecord(asRecord(metadata)?.context);
199
+ if (context?.available !== true) {
200
+ return [];
201
+ }
202
+ const tokens = asNumber(context.used_input_tokens);
203
+ const contextWindow = asNumber(context.context_window_tokens);
204
+ const ratio = asNumber(context.usage_ratio);
205
+ return [{
206
+ kind: "usage",
207
+ usage: { context: { tokens, contextWindow, percent: ratio === null ? null : ratio * 100 } },
208
+ }];
209
+ }
210
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../src/community/morph/projection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { RefusedSessionOptions } from "../../contracts/runtime.js";
2
+ import type { StartSession } from "../../contracts/session.js";
3
+ import { type ConsoleLease } from "./console.js";
4
+ export declare const morphRefusedSessionOptions: RefusedSessionOptions;
5
+ /** How a session gets its Console; tests hand in a scripted one. */
6
+ export type AcquireConsole = (command: string, stateDir: string) => Promise<ConsoleLease>;
7
+ export declare function morphSessionWith(acquire: AcquireConsole): StartSession;
8
+ export declare const morphSession: StartSession;
9
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/community/morph/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,KAAK,EAAsD,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAMnH,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AA8BhF,eAAO,MAAM,0BAA0B,EAAE,qBAIxC,CAAC;AAsBF,oEAAoE;AACpE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAE1F,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,YAAY,CAuKtE;AAED,eAAO,MAAM,YAAY,EAAE,YAA+C,CAAC"}
@@ -0,0 +1,220 @@
1
+ import { withdrawControl } from "../../shared/held-input.js";
2
+ import { inputImagesRefusal } from "../../shared/input-images.js";
3
+ import { sealSession } from "../../shared/seal-session.js";
4
+ import { createSessionKernel } from "../../shared/session-kernel.js";
5
+ import { refuseSessionOptions } from "../../shared/session-options.js";
6
+ import { acquireConsole, morphStateDir } from "./console.js";
7
+ import { MorphRefusalError, carrierTask, checkProfile, openTopic, stopTask, submitTask } from "./topic.js";
8
+ import { createTaskTracker } from "./tracker.js";
9
+ /*
10
+ * One OAR session is one morph Console topic (Session.id = topic id), driven
11
+ * through the Console Runtime API (mistermorph docs/runtime-api.md; probe:
12
+ * experiments/morph-runtime-probe.ts):
13
+ *
14
+ * - open: `POST /topics` creates the empty topic (resume: `GET /topics/{id}`),
15
+ * and `PUT /workspace` attaches `cwd` to it, on resume too, so the topic
16
+ * runs where this session says.
17
+ * - prompt: `POST /tasks {task, topic_id}`; the answer's task is the turn,
18
+ * followed by tracker.ts until its terminal status.
19
+ * - steer: the same `POST /tasks` while the topic runs. Console injects it
20
+ * into the run and answers a completed acknowledgement naming
21
+ * `steer_target_task_id`. When the run ended first, the text started a task
22
+ * of its own: it is followed as a spontaneous turn.
23
+ * - abort: `POST /tasks/{id}/stop`; the outcome is the task's `canceled`.
24
+ * - queue: held here and sent when the topic goes idle.
25
+ *
26
+ * Console is not this session's process: it is the user's own (never stopped
27
+ * by OAR) or one this process started for every session on the same state
28
+ * directory (console.ts). Text sent to a topic is read as a Console runtime
29
+ * command when it is one (`/reset`, `/models ...`), as in Console itself.
30
+ */
31
+ /** How long dispose waits for a stopped task's own `canceled` before letting go. */
32
+ const DISPOSE_SETTLE_MS = 3000;
33
+ export const morphRefusedSessionOptions = {
34
+ systemPrompt: "The morph Runtime API has no system prompt override",
35
+ appendSystemPrompt: "The morph Runtime API has no system prompt override",
36
+ env: "morph runs tools inside its Console process, which a session neither starts nor owns",
37
+ };
38
+ function refusal(error) {
39
+ return error instanceof MorphRefusalError
40
+ ? { kind: "rejected", code: error.refused ? "runtime_refused" : "error", reason: error.message, native: error.native }
41
+ : { kind: "rejected", code: "error", reason: error instanceof Error ? error.message : String(error) };
42
+ }
43
+ async function prepareTopic(client, options) {
44
+ if (options.model !== undefined) {
45
+ await checkProfile(client, options.model);
46
+ }
47
+ const topicId = await openTopic(client, options.resume);
48
+ await client.expect("PUT", "/workspace", { topic_id: topicId, workspace_dir: options.cwd });
49
+ return topicId;
50
+ }
51
+ export function morphSessionWith(acquire) {
52
+ return async (installation, options) => {
53
+ if (installation.via !== "executable") {
54
+ throw new Error("The morph session adapter needs an executable installation");
55
+ }
56
+ refuseSessionOptions(morphRefusedSessionOptions, options);
57
+ if (options.effort !== undefined) {
58
+ throw new Error(`morph's Runtime API has no reasoning-effort channel, so effort ${options.effort} cannot be applied`);
59
+ }
60
+ const lease = await acquire(installation.command, morphStateDir());
61
+ const { client } = lease;
62
+ const topicId = await prepareTopic(client, options).catch(async (error) => {
63
+ await lease.release();
64
+ throw error;
65
+ });
66
+ const kernel = createSessionKernel(topicId);
67
+ const held = [];
68
+ let disposed = false;
69
+ const body = (task) => ({
70
+ task,
71
+ topic_id: topicId,
72
+ workspace_dir: options.cwd,
73
+ ...(options.model === undefined ? {} : { llm_profile: options.model }),
74
+ });
75
+ // The runtime went away without anyone asking: one exit, then nothing runs.
76
+ const lost = (code) => {
77
+ if (kernel.unreachable() === null) {
78
+ kernel.respond("", { kind: "exited", code });
79
+ }
80
+ tracker.close();
81
+ held.length = 0;
82
+ };
83
+ const tracker = createTaskTracker({
84
+ client,
85
+ kernel,
86
+ topicId,
87
+ onIdle: () => {
88
+ const next = disposed ? undefined : held.shift();
89
+ if (next !== undefined) {
90
+ // The input was taken over at queue time; a send that fails leaves no turn.
91
+ void send(next.input);
92
+ }
93
+ },
94
+ onUnreachable: lease.owned ? null : () => {
95
+ lost(null);
96
+ },
97
+ });
98
+ lease.onExit(lost);
99
+ const send = async (input) => {
100
+ try {
101
+ const answer = await submitTask(client, body(input));
102
+ tracker.follow(carrierTask(answer));
103
+ return { kind: "accepted", native: answer };
104
+ }
105
+ catch (error) {
106
+ return refusal(error);
107
+ }
108
+ };
109
+ const capabilities = { queue: { durable: false }, attribution: "opaque", images: false };
110
+ const session = sealSession({
111
+ id: kernel.sessionId,
112
+ capabilities,
113
+ prompt: async (input, inputOptions) => {
114
+ // Busy is the status fold's word as the request is recorded (control()
115
+ // records it synchronously), so the contract's invariant holds by
116
+ // construction: a task followed but not yet seen working (a steer that
117
+ // became its own task) does not make the topic busy, and a prompt sent
118
+ // meanwhile is steered into it by Console.
119
+ const running = session.status().value.kind === "running";
120
+ const result = await kernel.control({ kind: "prompt", input, ...inputOptions }, async () => {
121
+ if (running) {
122
+ return { kind: "rejected", code: "busy", reason: "busy" };
123
+ }
124
+ const refused = inputImagesRefusal(capabilities, inputOptions?.images);
125
+ if (refused !== null) {
126
+ return refused;
127
+ }
128
+ const outcome = await send(input);
129
+ return outcome;
130
+ });
131
+ return result;
132
+ },
133
+ steer: async (input, inputOptions) => {
134
+ const result = await kernel.control({ kind: "steer", input, ...inputOptions }, async () => {
135
+ if (!tracker.busy()) {
136
+ return { kind: "rejected", code: "no_active_turn", reason: "not_steerable: no active turn" };
137
+ }
138
+ const refused = inputImagesRefusal(capabilities, inputOptions?.images);
139
+ if (refused !== null) {
140
+ return refused;
141
+ }
142
+ try {
143
+ const answer = await submitTask(client, body(input));
144
+ if (carrierTask(answer) === answer.id && answer.status === "done") {
145
+ // Console found the run but did not hold the input for it.
146
+ return { kind: "rejected", code: "runtime_refused", reason: "not_steerable: morph did not queue the input for the running task", native: answer };
147
+ }
148
+ // Steered into the run, or (the run ended first) a task of its own.
149
+ tracker.follow(carrierTask(answer));
150
+ return { kind: "accepted", native: answer };
151
+ }
152
+ catch (error) {
153
+ return refusal(error);
154
+ }
155
+ });
156
+ return result;
157
+ },
158
+ queue: async (input, inputOptions) => {
159
+ const result = await kernel.control({ kind: "queue", input, ...inputOptions }, async () => {
160
+ const refused = inputImagesRefusal(capabilities, inputOptions?.images);
161
+ if (refused !== null) {
162
+ return refused;
163
+ }
164
+ if (tracker.busy()) {
165
+ held.push({ input, inputId: inputOptions?.inputId });
166
+ return { kind: "accepted" };
167
+ }
168
+ const outcome = await send(input);
169
+ return outcome;
170
+ });
171
+ return result;
172
+ },
173
+ withdraw: withdrawControl(kernel, held),
174
+ abort: async () => {
175
+ const result = await kernel.control({ kind: "abort" }, async () => {
176
+ const active = tracker.active();
177
+ if (active === null) {
178
+ return { kind: "rejected", code: "no_active_turn", reason: "no active turn" };
179
+ }
180
+ const outcome = await stopTask(client, active);
181
+ return outcome;
182
+ });
183
+ return result;
184
+ },
185
+ rawEvents: (observer, cursor) => kernel.rawEvents(observer, cursor),
186
+ records: () => kernel.records(),
187
+ graph: () => kernel.graph(),
188
+ dispose: async () => {
189
+ if (disposed) {
190
+ return;
191
+ }
192
+ disposed = true;
193
+ const gone = kernel.unreachable() !== null;
194
+ const request = kernel.request("toRuntime", { kind: "dispose" });
195
+ held.length = 0;
196
+ if (!gone) {
197
+ const active = tracker.active();
198
+ if (active !== null) {
199
+ // The task's own `canceled` ends the turn in the stream, if it comes in time.
200
+ try {
201
+ await stopTask(client, active);
202
+ }
203
+ catch {
204
+ // Console may already be gone; releasing still settles.
205
+ }
206
+ await tracker.settle(DISPOSE_SETTLE_MS);
207
+ }
208
+ }
209
+ tracker.close();
210
+ const stopped = await lease.release();
211
+ // A Console this release stopped exits as the answer to the dispose; one
212
+ // still serving other sessions, or the user's own, was only let go.
213
+ kernel.respond(request.id, stopped === null || gone ? { kind: "accepted" } : { kind: "exited", code: stopped.code });
214
+ },
215
+ });
216
+ return session;
217
+ };
218
+ }
219
+ export const morphSession = morphSessionWith(acquireConsole);
220
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/community/morph/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ResponseBody } from "../../contracts/session.js";
2
+ import { type ConsoleClient, type ConsoleReply } from "./console.js";
3
+ /** A submission morph did not take: its answer, and whether it was a refusal (400) rather than a failure. */
4
+ export declare class MorphRefusalError extends Error {
5
+ readonly name = "MorphRefusalError";
6
+ readonly native: unknown;
7
+ readonly refused: boolean;
8
+ constructor(reply: ConsoleReply);
9
+ }
10
+ /** The topic a session runs in: the one to resume, checked to exist, or a new empty one (`POST /topics`). */
11
+ export declare function openTopic(client: ConsoleClient, resume: string | undefined): Promise<string>;
12
+ /** Refuse to open on an LLM profile Console does not have, rather than fail the first turn. */
13
+ export declare function checkProfile(client: ConsoleClient, model: string): Promise<void>;
14
+ /** `POST /tasks` into the topic; a non-200 answer or one without a task id is a `MorphRefusalError`. */
15
+ export declare function submitTask(client: ConsoleClient, body: Readonly<Record<string, unknown>>): Promise<Record<string, unknown> & {
16
+ readonly id: string;
17
+ }>;
18
+ /** `POST /tasks/{id}/stop`: accepted when Console found running work for the task. */
19
+ export declare function stopTask(client: ConsoleClient, taskId: string): Promise<ResponseBody>;
20
+ /** The task whose turn carries a submission: the run it steered into, or its own. */
21
+ export declare function carrierTask(answer: Readonly<Record<string, unknown>> & {
22
+ readonly id: string;
23
+ }): string;
24
+ //# sourceMappingURL=topic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topic.d.ts","sourceRoot":"","sources":["../../../src/community/morph/topic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAEnF,6GAA6G;AAC7G,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,SAAkB,IAAI,uBAAuB;IAC7C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEd,KAAK,EAAE,YAAY;CAKhC;AAED,6GAA6G;AAC7G,wBAAsB,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBlG;AAED,+FAA+F;AAC/F,wBAAsB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQtF;AAED,wGAAwG;AACxG,wBAAsB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ3J;AAED,sFAAsF;AACtF,wBAAsB,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAQ3F;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAGvG"}
@@ -0,0 +1,74 @@
1
+ import { asRecord, asRecordList } from "../../shared/json.js";
2
+ import { replyMessage } from "./console.js";
3
+ /** A submission morph did not take: its answer, and whether it was a refusal (400) rather than a failure. */
4
+ export class MorphRefusalError extends Error {
5
+ name = "MorphRefusalError";
6
+ native;
7
+ refused;
8
+ constructor(reply) {
9
+ super(replyMessage(reply));
10
+ this.native = reply.body;
11
+ this.refused = reply.status === 400;
12
+ }
13
+ }
14
+ /** The topic a session runs in: the one to resume, checked to exist, or a new empty one (`POST /topics`). */
15
+ export async function openTopic(client, resume) {
16
+ if (resume !== undefined) {
17
+ const reply = await client.call("GET", `/topics/${encodeURIComponent(resume)}`);
18
+ if (reply.status === 404) {
19
+ throw new Error(`morph has no topic ${resume} to resume`);
20
+ }
21
+ if (reply.status !== 200) {
22
+ throw new Error(`morph GET /topics/${resume} answered ${String(reply.status)}: ${replyMessage(reply)}`);
23
+ }
24
+ return resume;
25
+ }
26
+ const reply = await client.call("POST", "/topics", {});
27
+ if (reply.status === 405) {
28
+ throw new Error("This morph Console cannot create an empty topic (POST /topics); update morph to a version that has it");
29
+ }
30
+ if (reply.status !== 201 && reply.status !== 200) {
31
+ throw new Error(`morph POST /topics answered ${String(reply.status)}: ${replyMessage(reply)}`);
32
+ }
33
+ const id = asRecord(reply.body)?.id;
34
+ if (typeof id !== "string" || id === "") {
35
+ throw new Error("morph POST /topics answered without a topic id");
36
+ }
37
+ return id;
38
+ }
39
+ /** Refuse to open on an LLM profile Console does not have, rather than fail the first turn. */
40
+ export async function checkProfile(client, model) {
41
+ const catalog = asRecord(await client.expect("GET", "/llm/profiles"));
42
+ const names = [asRecord(catalog?.default), ...asRecordList(catalog?.items)]
43
+ .map((profile) => profile?.name)
44
+ .filter((name) => typeof name === "string");
45
+ if (!names.includes(model)) {
46
+ throw new Error(`morph has no LLM profile ${model} (configured: ${names.join(", ")})`);
47
+ }
48
+ }
49
+ /** `POST /tasks` into the topic; a non-200 answer or one without a task id is a `MorphRefusalError`. */
50
+ export async function submitTask(client, body) {
51
+ const reply = await client.call("POST", "/tasks", body);
52
+ const answer = asRecord(reply.body);
53
+ const id = answer?.id;
54
+ if (reply.status !== 200 || answer === null || typeof id !== "string") {
55
+ throw new MorphRefusalError(reply);
56
+ }
57
+ return { ...answer, id };
58
+ }
59
+ /** `POST /tasks/{id}/stop`: accepted when Console found running work for the task. */
60
+ export async function stopTask(client, taskId) {
61
+ const reply = await client.call("POST", `/tasks/${encodeURIComponent(taskId)}/stop`);
62
+ if (reply.status !== 200) {
63
+ return { kind: "rejected", code: "runtime_refused", reason: replyMessage(reply), native: reply.body };
64
+ }
65
+ return asRecord(reply.body)?.found === true
66
+ ? { kind: "accepted", native: reply.body }
67
+ : { kind: "rejected", code: "no_active_turn", reason: "morph found no running work for the task", native: reply.body };
68
+ }
69
+ /** The task whose turn carries a submission: the run it steered into, or its own. */
70
+ export function carrierTask(answer) {
71
+ const target = answer.steer_target_task_id;
72
+ return typeof target === "string" && target !== "" ? target : answer.id;
73
+ }
74
+ //# sourceMappingURL=topic.js.map