@botiverse/oar 0.0.10 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/README.md +2 -2
  2. package/dist/contracts/model-catalog.d.ts +1 -1
  3. package/dist/contracts/model-catalog.js +1 -1
  4. package/dist/contracts/provider-auth.d.ts +2 -2
  5. package/dist/contracts/provider-auth.js +2 -2
  6. package/dist/contracts/records.d.ts +205 -0
  7. package/dist/contracts/records.d.ts.map +1 -0
  8. package/dist/contracts/records.js +8 -0
  9. package/dist/contracts/records.js.map +1 -0
  10. package/dist/contracts/session.d.ts +83 -144
  11. package/dist/contracts/session.d.ts.map +1 -1
  12. package/dist/index.d.ts +6 -3
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +3 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/observe/agent-status.d.ts +32 -18
  17. package/dist/observe/agent-status.d.ts.map +1 -1
  18. package/dist/observe/agent-status.js +66 -14
  19. package/dist/observe/agent-status.js.map +1 -1
  20. package/dist/observe/aggregate-events.d.ts +7 -6
  21. package/dist/observe/aggregate-events.d.ts.map +1 -1
  22. package/dist/observe/aggregate-events.js +38 -28
  23. package/dist/observe/aggregate-events.js.map +1 -1
  24. package/dist/observe/index.d.ts +4 -1
  25. package/dist/observe/index.d.ts.map +1 -1
  26. package/dist/observe/index.js +3 -1
  27. package/dist/observe/index.js.map +1 -1
  28. package/dist/observe/observe-agent.d.ts +4 -4
  29. package/dist/observe/observe-agent.d.ts.map +1 -1
  30. package/dist/observe/observe-agent.js +3 -3
  31. package/dist/observe/observe-agent.js.map +1 -1
  32. package/dist/observe/stall-observer.d.ts +7 -6
  33. package/dist/observe/stall-observer.d.ts.map +1 -1
  34. package/dist/observe/stall-observer.js +6 -5
  35. package/dist/observe/stall-observer.js.map +1 -1
  36. package/dist/observe/tool-activity.d.ts +2 -2
  37. package/dist/observe/tool-activity.d.ts.map +1 -1
  38. package/dist/observe/tool-activity.js +1 -1
  39. package/dist/observe/tool-activity.js.map +1 -1
  40. package/dist/observe/turns.d.ts +37 -0
  41. package/dist/observe/turns.d.ts.map +1 -0
  42. package/dist/observe/turns.js +70 -0
  43. package/dist/observe/turns.js.map +1 -0
  44. package/dist/observe/usage.d.ts +15 -0
  45. package/dist/observe/usage.d.ts.map +1 -0
  46. package/dist/observe/usage.js +79 -0
  47. package/dist/observe/usage.js.map +1 -0
  48. package/dist/runtimes/claude/account-usage.js +1 -1
  49. package/dist/runtimes/claude/context-usage.d.ts +1 -1
  50. package/dist/runtimes/claude/context-usage.js +1 -1
  51. package/dist/runtimes/claude/projection.d.ts +40 -27
  52. package/dist/runtimes/claude/projection.d.ts.map +1 -1
  53. package/dist/runtimes/claude/projection.js +107 -21
  54. package/dist/runtimes/claude/projection.js.map +1 -1
  55. package/dist/runtimes/claude/session.d.ts.map +1 -1
  56. package/dist/runtimes/claude/session.js +119 -87
  57. package/dist/runtimes/claude/session.js.map +1 -1
  58. package/dist/runtimes/codex/app-server-client.d.ts +38 -3
  59. package/dist/runtimes/codex/app-server-client.d.ts.map +1 -1
  60. package/dist/runtimes/codex/app-server-client.js +62 -15
  61. package/dist/runtimes/codex/app-server-client.js.map +1 -1
  62. package/dist/runtimes/codex/projection.d.ts +12 -12
  63. package/dist/runtimes/codex/projection.d.ts.map +1 -1
  64. package/dist/runtimes/codex/projection.js +101 -38
  65. package/dist/runtimes/codex/projection.js.map +1 -1
  66. package/dist/runtimes/codex/rpc-control.d.ts +31 -0
  67. package/dist/runtimes/codex/rpc-control.d.ts.map +1 -0
  68. package/dist/runtimes/codex/rpc-control.js +51 -0
  69. package/dist/runtimes/codex/rpc-control.js.map +1 -0
  70. package/dist/runtimes/codex/session.d.ts.map +1 -1
  71. package/dist/runtimes/codex/session.js +199 -148
  72. package/dist/runtimes/codex/session.js.map +1 -1
  73. package/dist/runtimes/grok/session.d.ts +37 -1
  74. package/dist/runtimes/grok/session.d.ts.map +1 -1
  75. package/dist/runtimes/grok/session.js +74 -0
  76. package/dist/runtimes/grok/session.js.map +1 -1
  77. package/dist/runtimes/kimi/session.d.ts.map +1 -1
  78. package/dist/runtimes/kimi/session.js +5 -0
  79. package/dist/runtimes/kimi/session.js.map +1 -1
  80. package/dist/runtimes/pi/auth.d.ts.map +1 -1
  81. package/dist/runtimes/pi/auth.js +6 -1
  82. package/dist/runtimes/pi/auth.js.map +1 -1
  83. package/dist/runtimes/pi/catalog.d.ts.map +1 -1
  84. package/dist/runtimes/pi/catalog.js +6 -1
  85. package/dist/runtimes/pi/catalog.js.map +1 -1
  86. package/dist/runtimes/pi/http.d.ts +34 -0
  87. package/dist/runtimes/pi/http.d.ts.map +1 -0
  88. package/dist/runtimes/pi/http.js +95 -0
  89. package/dist/runtimes/pi/http.js.map +1 -0
  90. package/dist/runtimes/pi/list-models.d.ts.map +1 -1
  91. package/dist/runtimes/pi/list-models.js +10 -3
  92. package/dist/runtimes/pi/list-models.js.map +1 -1
  93. package/dist/runtimes/pi/open.d.ts +32 -0
  94. package/dist/runtimes/pi/open.d.ts.map +1 -0
  95. package/dist/runtimes/pi/open.js +106 -0
  96. package/dist/runtimes/pi/open.js.map +1 -0
  97. package/dist/runtimes/pi/projection.d.ts +27 -25
  98. package/dist/runtimes/pi/projection.d.ts.map +1 -1
  99. package/dist/runtimes/pi/projection.js +85 -50
  100. package/dist/runtimes/pi/projection.js.map +1 -1
  101. package/dist/runtimes/pi/session.d.ts +1 -22
  102. package/dist/runtimes/pi/session.d.ts.map +1 -1
  103. package/dist/runtimes/pi/session.js +178 -184
  104. package/dist/runtimes/pi/session.js.map +1 -1
  105. package/dist/shared/acp/client-app.d.ts +23 -0
  106. package/dist/shared/acp/client-app.d.ts.map +1 -0
  107. package/dist/shared/acp/client-app.js +55 -0
  108. package/dist/shared/acp/client-app.js.map +1 -0
  109. package/dist/shared/acp/model.d.ts +3 -17
  110. package/dist/shared/acp/model.d.ts.map +1 -1
  111. package/dist/shared/acp/model.js +3 -14
  112. package/dist/shared/acp/model.js.map +1 -1
  113. package/dist/shared/acp/profile.d.ts +32 -7
  114. package/dist/shared/acp/profile.d.ts.map +1 -1
  115. package/dist/shared/acp/profile.js +17 -8
  116. package/dist/shared/acp/profile.js.map +1 -1
  117. package/dist/shared/acp/projection.d.ts +16 -8
  118. package/dist/shared/acp/projection.d.ts.map +1 -1
  119. package/dist/shared/acp/projection.js +51 -32
  120. package/dist/shared/acp/projection.js.map +1 -1
  121. package/dist/shared/acp/records.d.ts +46 -0
  122. package/dist/shared/acp/records.d.ts.map +1 -0
  123. package/dist/shared/acp/records.js +125 -0
  124. package/dist/shared/acp/records.js.map +1 -0
  125. package/dist/shared/acp/session.d.ts.map +1 -1
  126. package/dist/shared/acp/session.js +98 -224
  127. package/dist/shared/acp/session.js.map +1 -1
  128. package/dist/shared/acp/terminal.d.ts +1 -3
  129. package/dist/shared/acp/terminal.d.ts.map +1 -1
  130. package/dist/shared/acp/terminal.js +1 -21
  131. package/dist/shared/acp/terminal.js.map +1 -1
  132. package/dist/shared/acp/turns.d.ts +45 -0
  133. package/dist/shared/acp/turns.d.ts.map +1 -0
  134. package/dist/shared/acp/turns.js +160 -0
  135. package/dist/shared/acp/turns.js.map +1 -0
  136. package/dist/shared/acp/usage-wait.d.ts +6 -6
  137. package/dist/shared/acp/usage-wait.d.ts.map +1 -1
  138. package/dist/shared/acp/usage-wait.js +2 -2
  139. package/dist/shared/acp/usage-wait.js.map +1 -1
  140. package/dist/shared/failure-class.d.ts +1 -1
  141. package/dist/shared/failure-class.js +2 -2
  142. package/dist/shared/failure-class.js.map +1 -1
  143. package/dist/shared/seal-session.d.ts +5 -3
  144. package/dist/shared/seal-session.d.ts.map +1 -1
  145. package/dist/shared/seal-session.js +24 -16
  146. package/dist/shared/seal-session.js.map +1 -1
  147. package/dist/shared/session-kernel.d.ts +68 -18
  148. package/dist/shared/session-kernel.d.ts.map +1 -1
  149. package/dist/shared/session-kernel.js +82 -42
  150. package/dist/shared/session-kernel.js.map +1 -1
  151. package/dist/voyage.d.ts +4 -7
  152. package/dist/voyage.d.ts.map +1 -1
  153. package/dist/voyage.js +14 -19
  154. package/dist/voyage.js.map +1 -1
  155. package/package.json +5 -6
  156. package/dist/runtimes/codex/context-usage.d.ts +0 -10
  157. package/dist/runtimes/codex/context-usage.d.ts.map +0 -1
  158. package/dist/runtimes/codex/context-usage.js +0 -16
  159. package/dist/runtimes/codex/context-usage.js.map +0 -1
@@ -1,64 +1,104 @@
1
1
  import { randomUUID } from "node:crypto";
2
+ async function settle(decide, issued) {
3
+ try {
4
+ return await decide(issued);
5
+ }
6
+ catch (error) {
7
+ return { kind: "rejected", reason: error instanceof Error ? error.message : String(error) };
8
+ }
9
+ }
10
+ function deliver(observer, record) {
11
+ try {
12
+ observer(record);
13
+ }
14
+ catch {
15
+ // Observers are a side-tap; their failures must not touch the run.
16
+ }
17
+ }
2
18
  export function createSessionKernel(sessionId = randomUUID()) {
3
19
  const observers = new Set();
20
+ const log = [];
21
+ const nodes = new Map([[sessionId, { id: sessionId }]]);
22
+ const edges = [];
4
23
  let seq = 0;
5
- let activeTurn = null;
6
- const fanOut = (turnId, body) => {
7
- const event = {
8
- sessionId,
9
- turnId,
24
+ let exited = false;
25
+ let disposing = false;
26
+ const append = (build, at) => {
27
+ const spanId = at?.spanId;
28
+ const record = build({
29
+ sessionId: at?.sessionId ?? sessionId,
30
+ agentPath: at?.agentPath ?? [],
31
+ ...(spanId === undefined ? {} : { spanId }),
10
32
  seq,
11
33
  receivedAt: Date.now(),
12
- ...body,
13
- };
34
+ });
14
35
  seq += 1;
36
+ log.push(record);
37
+ if (record.kind === "response" && record.body.kind === "exited") {
38
+ exited = true;
39
+ }
40
+ if (record.kind === "request" && record.direction === "toRuntime" && record.body.kind === "dispose") {
41
+ disposing = true;
42
+ }
15
43
  for (const observer of observers) {
16
- try {
17
- observer(event);
18
- }
19
- catch {
20
- // Observers are a side-tap; their failures must not touch the run.
21
- }
44
+ deliver(observer, record);
22
45
  }
46
+ return record;
23
47
  };
24
- const begin = () => {
25
- if (activeTurn !== null && !activeTurn.settled()) {
26
- return null;
48
+ const unreachable = () => {
49
+ if (exited) {
50
+ return { kind: "rejected", reason: "runtime exited" };
27
51
  }
28
- const id = randomUUID();
29
- let isSettled = false;
30
- const { promise: outcome, resolve: resolveOutcome } = Promise.withResolvers();
31
- const turn = {
32
- id,
33
- outcome,
34
- settled: () => isSettled,
35
- emit(body) {
36
- if (!isSettled) {
37
- fanOut(id, body);
38
- }
39
- },
40
- settle(result) {
41
- if (!isSettled) {
42
- fanOut(id, { kind: "turn_ended", outcome: result });
43
- isSettled = true;
44
- resolveOutcome(result);
45
- }
46
- },
47
- };
48
- activeTurn = turn;
49
- fanOut(id, { kind: "turn_started" });
50
- return turn;
52
+ return disposing ? { kind: "rejected", reason: "session disposed" } : null;
51
53
  };
54
+ const request = (direction, body, at) => append((envelope) => ({ ...envelope, kind: "request", id: at?.id ?? randomUUID(), direction, body }), at);
55
+ const respond = (requestId, body, at) => append((envelope) => ({ ...envelope, kind: "response", requestId, body }), at);
52
56
  return {
53
57
  sessionId,
54
- subscribe(observer) {
58
+ event: (body, at) => append((envelope) => ({ ...envelope, kind: "event", body }), at),
59
+ request,
60
+ respond,
61
+ async control(body, decide, at) {
62
+ const blocked = unreachable();
63
+ const issued = request("toRuntime", body, at);
64
+ const decided = blocked ?? await settle(decide, issued);
65
+ return { request: issued, response: respond(issued.id, decided, at) };
66
+ },
67
+ unreachable,
68
+ subscribe(observer, cursor) {
69
+ if (cursor !== undefined) {
70
+ if (cursor.sessionId !== sessionId) {
71
+ throw new Error(`cursor belongs to session ${cursor.sessionId}, not ${sessionId}`);
72
+ }
73
+ for (const record of log) {
74
+ if (record.seq > cursor.afterSeq) {
75
+ deliver(observer, record);
76
+ }
77
+ }
78
+ }
55
79
  observers.add(observer);
56
80
  return () => {
57
81
  observers.delete(observer);
58
82
  };
59
83
  },
60
- begin,
61
- active: () => (activeTurn !== null && !activeTurn.settled() ? activeTurn : null),
84
+ records: () => log,
85
+ graph: () => ({ nodes: [...nodes.values()], edges: [...edges] }),
86
+ node(id) {
87
+ if (!nodes.has(id)) {
88
+ nodes.set(id, { id });
89
+ }
90
+ },
91
+ link(edge) {
92
+ if (!nodes.has(edge.parent)) {
93
+ nodes.set(edge.parent, { id: edge.parent });
94
+ }
95
+ if (!nodes.has(edge.child)) {
96
+ nodes.set(edge.child, { id: edge.child });
97
+ }
98
+ if (!edges.some((known) => known.parent === edge.parent && known.child === edge.child && known.via === edge.via)) {
99
+ edges.push(edge);
100
+ }
101
+ },
62
102
  };
63
103
  }
64
104
  //# sourceMappingURL=session-kernel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-kernel.js","sourceRoot":"","sources":["../../src/shared/session-kernel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAgCzC,MAAM,UAAU,mBAAmB,CAAC,YAAoB,UAAU,EAAE;IAClE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC7C,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,UAAU,GAAsB,IAAI,CAAC;IAEzC,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,IAAsB,EAAQ,EAAE;QAC9D,MAAM,KAAK,GAAG;YACZ,SAAS;YACT,MAAM;YACN,GAAG;YACH,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,GAAG,IAAI;SACR,CAAC;QACF,GAAG,IAAI,CAAC,CAAC;QACT,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,mEAAmE;YACrE,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAsB,EAAE;QACpC,IAAI,UAAU,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,aAAa,EAAe,CAAC;QAC3F,MAAM,IAAI,GAAe;YACvB,EAAE;YACF,OAAO;YACP,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;YACxB,IAAI,CAAC,IAAI;gBACP,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,MAAM,CAAC,MAAM;gBACX,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;oBACpD,SAAS,GAAG,IAAI,CAAC;oBACjB,cAAc,CAAC,MAAM,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;SACF,CAAC;QACF,UAAU,GAAG,IAAI,CAAC;QAClB,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,OAAO;QACL,SAAS;QACT,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;QACD,KAAK;QACL,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;KACjF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"session-kernel.js","sourceRoot":"","sources":["../../src/shared/session-kernel.ts"],"names":[],"mappings":"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"}
package/dist/voyage.d.ts CHANGED
@@ -1,6 +1,5 @@
1
- import type { SessionEvent } from "./contracts/session.js";
2
- export declare const VOYAGE_FORMAT = "oar-voyage/1";
3
- export type SubmissionVia = "prompt" | "steer" | "queue";
1
+ import type { SessionRecord } from "./contracts/session.js";
2
+ export declare const VOYAGE_FORMAT = "oar-voyage/2";
4
3
  export interface VoyageHeader {
5
4
  readonly runtime: string;
6
5
  readonly model?: string;
@@ -10,12 +9,10 @@ export interface VoyageHeader {
10
9
  readonly recorder: string;
11
10
  }
12
11
  export declare function headerLine(header: VoyageHeader): string;
13
- export declare function submissionLine(at: number, via: SubmissionVia, text: string): string;
14
- export declare function eventLine(event: SessionEvent): string;
12
+ export declare function recordLine(record: SessionRecord): string;
15
13
  export declare function endLine(at: number, reason: string): string;
16
14
  export interface VoyageRecorder {
17
- submission(via: SubmissionVia, text: string): void;
18
- event(event: SessionEvent): void;
15
+ record(record: SessionRecord): void;
19
16
  end(reason: string): void;
20
17
  }
21
18
  export declare function openVoyage(path: string, header: VoyageHeader): VoyageRecorder;
@@ -1 +1 @@
1
- {"version":3,"file":"voyage.d.ts","sourceRoot":"","sources":["../src/voyage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAS3D,eAAO,MAAM,aAAa,iBAAiB,CAAC;AAE5C,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAWvD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAErD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACnD,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IACjC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,cAAc,CAkB7E"}
1
+ {"version":3,"file":"voyage.d.ts","sourceRoot":"","sources":["../src/voyage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAU5D,eAAO,MAAM,aAAa,iBAAiB,CAAC;AAE5C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAWvD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAExD;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,cAAc,CAe7E"}
package/dist/voyage.js CHANGED
@@ -1,11 +1,12 @@
1
1
  import { closeSync, openSync, writeSync } from "node:fs";
2
- // The oar-voyage/1 JSONL format: one JSON object per line, discriminated by
3
- // `kind`. Line 1 is `header`; `submission` marks each human input; `event`
4
- // wraps one raw SessionEvent verbatim (no filtering or re-timestamping);
5
- // `end` is the last line — a log without it is a truncated capture. All
6
- // timestamps are Unix epoch milliseconds on the same clock as `receivedAt`.
7
- // The format is defined and owned by oar; other tools may consume it.
8
- export const VOYAGE_FORMAT = "oar-voyage/1";
2
+ // The oar-voyage/2 JSONL format: one JSON object per line, discriminated by
3
+ // `kind`. Line 1 is `header`; `record` wraps one SessionRecord verbatim (no
4
+ // filtering or re-timestamping: human inputs are in the stream already, as
5
+ // request records); `end` is the last line; a log without it is a truncated
6
+ // capture. All timestamps are Unix epoch milliseconds on the same clock as
7
+ // `receivedAt`. The format is defined and owned by oar; other tools may
8
+ // consume it.
9
+ export const VOYAGE_FORMAT = "oar-voyage/2";
9
10
  export function headerLine(header) {
10
11
  return JSON.stringify({
11
12
  kind: "header",
@@ -18,17 +19,14 @@ export function headerLine(header) {
18
19
  recorder: header.recorder,
19
20
  });
20
21
  }
21
- export function submissionLine(at, via, text) {
22
- return JSON.stringify({ kind: "submission", at, via, text });
23
- }
24
- export function eventLine(event) {
25
- return JSON.stringify({ kind: "event", event });
22
+ export function recordLine(record) {
23
+ return JSON.stringify({ kind: "record", record });
26
24
  }
27
25
  export function endLine(at, reason) {
28
26
  return JSON.stringify({ kind: "end", at, reason });
29
27
  }
30
- // Lines go through synchronous fd writes so their order — and everything
31
- // written so far — survives a crashing process; `end` closes the file.
28
+ // Lines go through synchronous fd writes so their order, and everything
29
+ // written so far, survives a crashing process; `end` closes the file.
32
30
  export function openVoyage(path, header) {
33
31
  const fd = openSync(path, "w");
34
32
  const write = (line) => {
@@ -36,11 +34,8 @@ export function openVoyage(path, header) {
36
34
  };
37
35
  write(headerLine(header));
38
36
  return {
39
- submission(via, text) {
40
- write(submissionLine(Date.now(), via, text));
41
- },
42
- event(event) {
43
- write(eventLine(event));
37
+ record(record) {
38
+ write(recordLine(record));
44
39
  },
45
40
  end(reason) {
46
41
  write(endLine(Date.now(), reason));
@@ -1 +1 @@
1
- {"version":3,"file":"voyage.js","sourceRoot":"","sources":["../src/voyage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzD,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,wEAAwE;AACxE,4EAA4E;AAC5E,sEAAsE;AAEtE,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC;AAa5C,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9D,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,GAAkB,EAAE,IAAY;IACzE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAmB;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAU,EAAE,MAAc;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACrD,CAAC;AAQD,yEAAyE;AACzE,uEAAuE;AACvE,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,MAAoB;IAC3D,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAQ,EAAE;QACnC,SAAS,CAAC,EAAE,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC;IACF,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1B,OAAO;QACL,UAAU,CAAC,GAAG,EAAE,IAAI;YAClB,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,KAAK;YACT,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1B,CAAC;QACD,GAAG,CAAC,MAAM;YACR,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;YACnC,SAAS,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"voyage.js","sourceRoot":"","sources":["../src/voyage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzD,4EAA4E;AAC5E,4EAA4E;AAC5E,2EAA2E;AAC3E,4EAA4E;AAC5E,2EAA2E;AAC3E,wEAAwE;AACxE,cAAc;AAEd,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC;AAW5C,MAAM,UAAU,UAAU,CAAC,MAAoB;IAC7C,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9D,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAqB;IAC9C,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAU,EAAE,MAAc;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACrD,CAAC;AAOD,wEAAwE;AACxE,sEAAsE;AACtE,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,MAAoB;IAC3D,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAQ,EAAE;QACnC,SAAS,CAAC,EAAE,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC;IACF,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1B,OAAO;QACL,MAAM,CAAC,MAAM;YACX,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5B,CAAC;QACD,GAAG,CAAC,MAAM;YACR,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;YACnC,SAAS,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@botiverse/oar",
3
- "version": "0.0.10",
4
- "description": "Provider-independent contracts for observing agent runtimes",
3
+ "version": "0.1.0",
4
+ "description": "A programming interface for all agent harnesses: provider-independent contracts for controlling and observing agent runtimes",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -31,13 +31,12 @@
31
31
  "directory": "packages/oar"
32
32
  },
33
33
  "license": "Apache-2.0",
34
- "optionalDependencies": {
35
- "@earendil-works/pi-coding-agent": "^0.84.2"
36
- },
37
34
  "dependencies": {
38
35
  "@agentclientprotocol/sdk": "^1.4.0",
39
36
  "cross-spawn": "^7.0.6",
40
- "which": "^2.0.2"
37
+ "which": "^2.0.2",
38
+ "@earendil-works/pi-coding-agent": "^0.84.2",
39
+ "undici": "8.9.0"
41
40
  },
42
41
  "devDependencies": {
43
42
  "@types/cross-spawn": "^6.0.6",
@@ -1,10 +0,0 @@
1
- import type { ContextUsage } from "../../contracts/session.js";
2
- import { type JsonRecord } from "../../shared/json.js";
3
- /**
4
- * Codex reports usage in the streaming thread/tokenUsage/updated notification
5
- * (cumulative). `total.inputTokens` is the context sent; codex does NOT
6
- * include the context window in this event, so contextWindow/percent stay
7
- * null unless a future field carries it. We cache the latest (last-wins).
8
- */
9
- export declare function codexContextUsageFromNotification(params: JsonRecord): ContextUsage | null;
10
- //# sourceMappingURL=context-usage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-usage.d.ts","sourceRoot":"","sources":["../../../src/runtimes/codex/context-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE3E;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAOzF"}
@@ -1,16 +0,0 @@
1
- import { asNumber, asRecord } from "../../shared/json.js";
2
- /**
3
- * Codex reports usage in the streaming thread/tokenUsage/updated notification
4
- * (cumulative). `total.inputTokens` is the context sent; codex does NOT
5
- * include the context window in this event, so contextWindow/percent stay
6
- * null unless a future field carries it. We cache the latest (last-wins).
7
- */
8
- export function codexContextUsageFromNotification(params) {
9
- const total = asRecord(asRecord(params.tokenUsage)?.total);
10
- if (total === null) {
11
- return null;
12
- }
13
- const tokens = asNumber(total.inputTokens);
14
- return { tokens: tokens ?? null, contextWindow: null, percent: null };
15
- }
16
- //# sourceMappingURL=context-usage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-usage.js","sourceRoot":"","sources":["../../../src/runtimes/codex/context-usage.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAmB,MAAM,sBAAsB,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAAC,MAAkB;IAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACxE,CAAC"}