@exoscient/control-panel 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 (77) hide show
  1. package/README.md +14 -0
  2. package/dist/AppControlPanel.d.ts +77 -0
  3. package/dist/AppControlPanel.d.ts.map +1 -0
  4. package/dist/AppControlPanel.js +1625 -0
  5. package/dist/AppControlPanel.js.map +1 -0
  6. package/dist/ControlPanelShell.d.ts +39 -0
  7. package/dist/ControlPanelShell.d.ts.map +1 -0
  8. package/dist/ControlPanelShell.js +152 -0
  9. package/dist/ControlPanelShell.js.map +1 -0
  10. package/dist/ExoLauncherSimulator.d.ts +36 -0
  11. package/dist/ExoLauncherSimulator.d.ts.map +1 -0
  12. package/dist/ExoLauncherSimulator.js +253 -0
  13. package/dist/ExoLauncherSimulator.js.map +1 -0
  14. package/dist/TaskDetail.d.ts +180 -0
  15. package/dist/TaskDetail.d.ts.map +1 -0
  16. package/dist/TaskDetail.js +889 -0
  17. package/dist/TaskDetail.js.map +1 -0
  18. package/dist/TaskListPage.d.ts +28 -0
  19. package/dist/TaskListPage.d.ts.map +1 -0
  20. package/dist/TaskListPage.js +16 -0
  21. package/dist/TaskListPage.js.map +1 -0
  22. package/dist/TaskWorkspace.d.ts +62 -0
  23. package/dist/TaskWorkspace.d.ts.map +1 -0
  24. package/dist/TaskWorkspace.js +592 -0
  25. package/dist/TaskWorkspace.js.map +1 -0
  26. package/dist/ai-plane.d.ts +75 -0
  27. package/dist/ai-plane.d.ts.map +1 -0
  28. package/dist/ai-plane.js +124 -0
  29. package/dist/ai-plane.js.map +1 -0
  30. package/dist/browser-icons.d.ts +25 -0
  31. package/dist/browser-icons.d.ts.map +1 -0
  32. package/dist/browser-icons.js +125 -0
  33. package/dist/browser-icons.js.map +1 -0
  34. package/dist/client-actions.d.ts +45 -0
  35. package/dist/client-actions.d.ts.map +1 -0
  36. package/dist/client-actions.js +48 -0
  37. package/dist/client-actions.js.map +1 -0
  38. package/dist/control-panel-shared.d.ts +58 -0
  39. package/dist/control-panel-shared.d.ts.map +1 -0
  40. package/dist/control-panel-shared.js +79 -0
  41. package/dist/control-panel-shared.js.map +1 -0
  42. package/dist/control-panel.css +4156 -0
  43. package/dist/index.d.ts +30 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +16 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/repository-workflow.d.ts +27 -0
  48. package/dist/repository-workflow.d.ts.map +1 -0
  49. package/dist/repository-workflow.js +24 -0
  50. package/dist/repository-workflow.js.map +1 -0
  51. package/dist/result.d.ts +6 -0
  52. package/dist/result.d.ts.map +1 -0
  53. package/dist/result.js +77 -0
  54. package/dist/result.js.map +1 -0
  55. package/dist/task-consistency.d.ts +28 -0
  56. package/dist/task-consistency.d.ts.map +1 -0
  57. package/dist/task-consistency.js +25 -0
  58. package/dist/task-consistency.js.map +1 -0
  59. package/dist/task-detail.browser.js +2709 -0
  60. package/dist/task-detail.css +1601 -0
  61. package/dist/task-state.d.ts +11 -0
  62. package/dist/task-state.d.ts.map +1 -0
  63. package/dist/task-state.js +103 -0
  64. package/dist/task-state.js.map +1 -0
  65. package/dist/telemetry.d.ts +39 -0
  66. package/dist/telemetry.d.ts.map +1 -0
  67. package/dist/telemetry.js +106 -0
  68. package/dist/telemetry.js.map +1 -0
  69. package/dist/trace.d.ts +80 -0
  70. package/dist/trace.d.ts.map +1 -0
  71. package/dist/trace.js +694 -0
  72. package/dist/trace.js.map +1 -0
  73. package/dist/updates.d.ts +72 -0
  74. package/dist/updates.d.ts.map +1 -0
  75. package/dist/updates.js +269 -0
  76. package/dist/updates.js.map +1 -0
  77. package/package.json +58 -0
@@ -0,0 +1,11 @@
1
+ import type { AgentTask, AgentTurn } from './TaskDetail';
2
+ import type { AgentTraceEvent } from './trace';
3
+ export declare function mergeTasks(currentTasks: AgentTask[], loadedTasks: AgentTask[], version?: number): AgentTask[];
4
+ export declare function upsertTask(tasks: AgentTask[], task: AgentTask, version?: number): AgentTask[];
5
+ export declare function taskSyncVersion(task: AgentTask): number;
6
+ export declare function lastTaskTurn(task: AgentTask): AgentTurn;
7
+ export declare function mergeTaskTrace(tasks: AgentTask[], taskId: string, turnId: string, trace: AgentTurn['trace']): AgentTask[];
8
+ export declare function appendTaskTraceEvent(tasks: AgentTask[], taskId: string, turnId: string, traceEvent: AgentTraceEvent): AgentTask[];
9
+ export declare function mergeTaskTraceEvents(freshTask: AgentTask, currentTask: AgentTask): AgentTask;
10
+ export declare function turnHasTraceEvents(task: AgentTask, turnId: string): boolean;
11
+ //# sourceMappingURL=task-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-state.d.ts","sourceRoot":"","sources":["../src/task-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAS9C,wBAAgB,UAAU,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,eAiB/F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,eAS/E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,UAE9C;AAUD,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,aAE3C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,eAQ3G;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,eAkBnH;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,GAAG,SAAS,CAwB5F;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,WAEjE"}
@@ -0,0 +1,103 @@
1
+ // `version` is the update number under which the incoming state was learned: the stream
2
+ // item's updateNumber for streamed task payloads, or the snapshot's updateNumber for
3
+ // fetched state (the server reads the cursor before the state, so a snapshot reflects
4
+ // every update <= its updateNumber). Writes carrying an older version than the state
5
+ // already applied are rejected — an in-flight response that straddled a turn completion
6
+ // must not regress the newer streamed state. Omitting `version` (e.g. POST responses,
7
+ // which carry no cursor) applies unconditionally but preserves the existing tag.
8
+ export function mergeTasks(currentTasks, loadedTasks, version) {
9
+ const currentById = new Map(currentTasks.map((task) => [task.id, task]));
10
+ const merged = loadedTasks.map((task) => {
11
+ const current = currentById.get(task.id);
12
+ if (current && isStaleTaskWrite(current, version)) {
13
+ return current;
14
+ }
15
+ const stamped = stampTaskVersion(task, current, version);
16
+ if (current) {
17
+ return mergeTaskTraceEvents(stamped, current);
18
+ }
19
+ return stamped;
20
+ });
21
+ const loadedIds = new Set(loadedTasks.map((task) => task.id));
22
+ return [...currentTasks.filter((task) => !loadedIds.has(task.id)), ...merged];
23
+ }
24
+ export function upsertTask(tasks, task, version) {
25
+ const current = tasks.find((item) => item.id === task.id);
26
+ if (current && isStaleTaskWrite(current, version)) {
27
+ return tasks;
28
+ }
29
+ const stamped = stampTaskVersion(task, current, version);
30
+ const merged = current ? mergeTaskTraceEvents(stamped, current) : stamped;
31
+ return [...tasks.filter((item) => item.id !== task.id), merged];
32
+ }
33
+ export function taskSyncVersion(task) {
34
+ return task.syncVersion ?? 0;
35
+ }
36
+ function isStaleTaskWrite(current, version) {
37
+ return version !== undefined && taskSyncVersion(current) > version;
38
+ }
39
+ function stampTaskVersion(task, current, version) {
40
+ return { ...task, syncVersion: version ?? current?.syncVersion };
41
+ }
42
+ export function lastTaskTurn(task) {
43
+ return task.turns[task.turns.length - 1] ?? null;
44
+ }
45
+ export function mergeTaskTrace(tasks, taskId, turnId, trace) {
46
+ return tasks.map((task) => {
47
+ if (task.id !== taskId)
48
+ return task;
49
+ return {
50
+ ...task,
51
+ turns: task.turns.map((turn) => turn.id === turnId ? { ...turn, trace } : turn),
52
+ };
53
+ });
54
+ }
55
+ export function appendTaskTraceEvent(tasks, taskId, turnId, traceEvent) {
56
+ return tasks.map((task) => {
57
+ if (task.id !== taskId)
58
+ return task;
59
+ return {
60
+ ...task,
61
+ turns: task.turns.map((turn) => {
62
+ if (turn.id !== turnId)
63
+ return turn;
64
+ const currentTrace = turn.trace ?? { prompt: '', events: [] };
65
+ return {
66
+ ...turn,
67
+ trace: {
68
+ ...currentTrace,
69
+ events: [...(currentTrace.events ?? []), traceEvent],
70
+ },
71
+ };
72
+ }),
73
+ };
74
+ });
75
+ }
76
+ export function mergeTaskTraceEvents(freshTask, currentTask) {
77
+ const currentTurnsById = new Map(currentTask.turns.map((turn) => [turn.id, turn]));
78
+ return {
79
+ ...freshTask,
80
+ turns: freshTask.turns.map((freshTurn) => {
81
+ const currentTurn = currentTurnsById.get(freshTurn.id);
82
+ if (!currentTurn || (freshTurn.trace?.events?.length ?? 0) > 0 || (currentTurn.trace?.events?.length ?? 0) === 0) {
83
+ return freshTurn;
84
+ }
85
+ return {
86
+ ...freshTurn,
87
+ trace: {
88
+ ...freshTurn.trace,
89
+ ...currentTurn.trace,
90
+ prompt: freshTurn.trace?.prompt ?? currentTurn.trace?.prompt,
91
+ startedAt: freshTurn.trace?.startedAt ?? currentTurn.trace?.startedAt,
92
+ completedAt: freshTurn.trace?.completedAt ?? currentTurn.trace?.completedAt,
93
+ error: freshTurn.trace?.error ?? currentTurn.trace?.error,
94
+ events: currentTurn.trace?.events ?? [],
95
+ },
96
+ };
97
+ }),
98
+ };
99
+ }
100
+ export function turnHasTraceEvents(task, turnId) {
101
+ return task.turns.some((turn) => turn.id === turnId && (turn.trace?.events?.length ?? 0) > 0);
102
+ }
103
+ //# sourceMappingURL=task-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-state.js","sourceRoot":"","sources":["../src/task-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export type ClientTelemetrySeverity = 'info' | 'warning' | 'error';
2
+ export type ClientTelemetryEvent = {
3
+ type: string;
4
+ severity?: ClientTelemetrySeverity;
5
+ observedAt?: string;
6
+ route?: string;
7
+ details?: Record<string, unknown>;
8
+ };
9
+ export type ClientTelemetryServiceOptions = {
10
+ baseUrl?: string;
11
+ accessToken?: () => string | null;
12
+ fetch?: typeof fetch;
13
+ endpoint?: string;
14
+ flushIntervalMs?: number;
15
+ maxBatchSize?: number;
16
+ maxQueueSize?: number;
17
+ };
18
+ export declare class ClientTelemetryService {
19
+ private readonly baseUrl;
20
+ private readonly accessToken;
21
+ private readonly fetchImpl;
22
+ private readonly endpoint;
23
+ private readonly flushIntervalMs;
24
+ private readonly maxBatchSize;
25
+ private readonly maxQueueSize;
26
+ private readonly queue;
27
+ private flushTimer;
28
+ private flushing;
29
+ constructor(options?: ClientTelemetryServiceOptions);
30
+ record(event: ClientTelemetryEvent): void;
31
+ flush(): Promise<void>;
32
+ private scheduleFlush;
33
+ private flushWithBeacon;
34
+ private requeue;
35
+ private headers;
36
+ private url;
37
+ private beaconUrl;
38
+ }
39
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;AAElE,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,uBAAuB,CAAA;IAClC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;IACjC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,UAAU,CAA6C;IAC/D,OAAO,CAAC,QAAQ,CAAQ;gBAEZ,OAAO,GAAE,6BAAkC;IAcvD,MAAM,CAAC,KAAK,EAAE,oBAAoB;IAa5B,KAAK;IA+BX,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,SAAS;CAMlB"}
@@ -0,0 +1,106 @@
1
+ export class ClientTelemetryService {
2
+ constructor(options = {}) {
3
+ this.queue = [];
4
+ this.flushTimer = null;
5
+ this.flushing = false;
6
+ this.baseUrl = options.baseUrl ?? '';
7
+ this.accessToken = options.accessToken ?? (() => null);
8
+ this.fetchImpl = options.fetch ?? fetch;
9
+ this.endpoint = options.endpoint ?? '/api/client-telemetry';
10
+ this.flushIntervalMs = options.flushIntervalMs ?? 5000;
11
+ this.maxBatchSize = options.maxBatchSize ?? 20;
12
+ this.maxQueueSize = options.maxQueueSize ?? 200;
13
+ if (typeof window !== 'undefined') {
14
+ window.addEventListener('pagehide', () => this.flushWithBeacon());
15
+ }
16
+ }
17
+ record(event) {
18
+ if (this.queue.length >= this.maxQueueSize) {
19
+ this.queue.shift();
20
+ }
21
+ this.queue.push({
22
+ ...event,
23
+ observedAt: event.observedAt ?? new Date().toISOString(),
24
+ route: event.route ?? currentRoute(),
25
+ });
26
+ this.scheduleFlush();
27
+ }
28
+ async flush() {
29
+ if (this.flushing || this.queue.length === 0) {
30
+ return;
31
+ }
32
+ this.flushing = true;
33
+ if (this.flushTimer !== null) {
34
+ clearTimeout(this.flushTimer);
35
+ this.flushTimer = null;
36
+ }
37
+ const batch = this.queue.splice(0, this.maxBatchSize);
38
+ try {
39
+ const response = await this.fetchImpl(this.url(), {
40
+ method: 'POST',
41
+ headers: this.headers({ 'content-type': 'application/json' }),
42
+ body: JSON.stringify({ events: batch }),
43
+ });
44
+ if (!response.ok) {
45
+ this.requeue(batch);
46
+ }
47
+ }
48
+ catch {
49
+ this.requeue(batch);
50
+ }
51
+ finally {
52
+ this.flushing = false;
53
+ if (this.queue.length > 0) {
54
+ this.scheduleFlush();
55
+ }
56
+ }
57
+ }
58
+ scheduleFlush() {
59
+ if (this.flushTimer !== null) {
60
+ return;
61
+ }
62
+ this.flushTimer = setTimeout(() => {
63
+ void this.flush();
64
+ }, this.flushIntervalMs);
65
+ }
66
+ flushWithBeacon() {
67
+ if (this.queue.length === 0 || typeof navigator === 'undefined' || !navigator.sendBeacon) {
68
+ return;
69
+ }
70
+ const batch = this.queue.splice(0, this.maxBatchSize);
71
+ const body = JSON.stringify({ events: batch });
72
+ if (!navigator.sendBeacon(this.beaconUrl(), new Blob([body], { type: 'application/json' }))) {
73
+ this.requeue(batch);
74
+ }
75
+ }
76
+ requeue(events) {
77
+ this.queue.unshift(...events);
78
+ if (this.queue.length > this.maxQueueSize) {
79
+ this.queue.splice(0, this.queue.length - this.maxQueueSize);
80
+ }
81
+ }
82
+ headers(init = {}) {
83
+ const headers = new Headers(init);
84
+ const token = this.accessToken();
85
+ if (token)
86
+ headers.set('authorization', `Bearer ${token}`);
87
+ return headers;
88
+ }
89
+ url() {
90
+ return `${this.baseUrl}${this.endpoint}`;
91
+ }
92
+ beaconUrl() {
93
+ const token = this.accessToken();
94
+ if (!token)
95
+ return this.url();
96
+ const separator = this.endpoint.includes('?') ? '&' : '?';
97
+ return `${this.baseUrl}${this.endpoint}${separator}accessToken=${encodeURIComponent(token)}`;
98
+ }
99
+ }
100
+ function currentRoute() {
101
+ if (typeof window === 'undefined') {
102
+ return undefined;
103
+ }
104
+ return `${window.location.pathname}${window.location.search}${window.location.hash}`;
105
+ }
106
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ export type AgentTraceEvent = {
2
+ type?: string;
3
+ at?: string;
4
+ stream?: string;
5
+ message?: string;
6
+ [key: string]: unknown;
7
+ };
8
+ export type TraceItem = {
9
+ kind: 'assistant';
10
+ at: string;
11
+ text: string;
12
+ } | {
13
+ kind: 'result';
14
+ at: string;
15
+ text: string;
16
+ } | {
17
+ kind: 'command';
18
+ at: string;
19
+ title: string;
20
+ itemId?: string;
21
+ command?: string;
22
+ output?: string;
23
+ status?: string;
24
+ raw?: string;
25
+ } | {
26
+ kind: 'tool';
27
+ at: string;
28
+ title: string;
29
+ input?: string;
30
+ output?: string;
31
+ status?: string;
32
+ raw?: string;
33
+ } | {
34
+ kind: 'file';
35
+ at: string;
36
+ title: string;
37
+ path?: string;
38
+ text?: string;
39
+ raw?: string;
40
+ } | {
41
+ kind: 'output';
42
+ at: string;
43
+ stream?: string;
44
+ text: string;
45
+ } | {
46
+ kind: 'tokens';
47
+ at: string;
48
+ text: string;
49
+ raw?: string;
50
+ } | {
51
+ kind: 'status';
52
+ at: string;
53
+ text: string;
54
+ raw?: string;
55
+ } | {
56
+ kind: 'raw';
57
+ at: string;
58
+ label: string;
59
+ text: string;
60
+ } | {
61
+ kind: 'error';
62
+ at: string;
63
+ text: string;
64
+ raw?: string;
65
+ };
66
+ export type TraceFilter = 'narration' | 'coding' | 'shell' | 'tokens' | 'status' | 'errors' | 'raw';
67
+ export type ContextPressure = {
68
+ usedTokens: number;
69
+ contextWindow: number;
70
+ ratio: number;
71
+ percent: number;
72
+ tone: 'low' | 'medium' | 'high' | 'critical';
73
+ source: 'last-input' | 'reported-input';
74
+ label: string;
75
+ };
76
+ export declare function buildTraceItems(events: AgentTraceEvent[]): TraceItem[];
77
+ export declare function traceItemMatchesFilter(item: TraceItem, filters: TraceFilter[]): boolean;
78
+ export declare function latestContextPressure(events: AgentTraceEvent[]): ContextPressure | null;
79
+ export declare function readableJson(value: string): string;
80
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}