@playcraft/common 0.0.59 → 0.1.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 (93) hide show
  1. package/dist/cloud-workspace/runtime/agent-background-processes.d.ts +68 -0
  2. package/dist/cloud-workspace/runtime/agent-background-processes.d.ts.map +1 -0
  3. package/dist/cloud-workspace/runtime/agent-background-processes.js +60 -0
  4. package/dist/cloud-workspace/runtime/agent-background-processes.js.map +1 -0
  5. package/dist/cloud-workspace/runtime/agent-chat-flush.d.ts +3 -5
  6. package/dist/cloud-workspace/runtime/agent-chat-flush.d.ts.map +1 -1
  7. package/dist/cloud-workspace/runtime/agent-chat-flush.js +2 -6
  8. package/dist/cloud-workspace/runtime/agent-chat-flush.js.map +1 -1
  9. package/dist/cloud-workspace/runtime/agent-command.d.ts +25 -3
  10. package/dist/cloud-workspace/runtime/agent-command.d.ts.map +1 -1
  11. package/dist/cloud-workspace/runtime/agent-command.js +15 -0
  12. package/dist/cloud-workspace/runtime/agent-command.js.map +1 -1
  13. package/dist/cloud-workspace/runtime/agent-competitor-report.d.ts +143 -0
  14. package/dist/cloud-workspace/runtime/agent-competitor-report.d.ts.map +1 -0
  15. package/dist/cloud-workspace/runtime/agent-competitor-report.js +115 -0
  16. package/dist/cloud-workspace/runtime/agent-competitor-report.js.map +1 -0
  17. package/dist/cloud-workspace/runtime/agent-issue-artifacts.d.ts +90 -0
  18. package/dist/cloud-workspace/runtime/agent-issue-artifacts.d.ts.map +1 -0
  19. package/dist/cloud-workspace/runtime/agent-issue-artifacts.js +60 -0
  20. package/dist/cloud-workspace/runtime/agent-issue-artifacts.js.map +1 -0
  21. package/dist/cloud-workspace/runtime/agent-lifecycle.d.ts +5 -3
  22. package/dist/cloud-workspace/runtime/agent-lifecycle.d.ts.map +1 -1
  23. package/dist/cloud-workspace/runtime/agent-lifecycle.js +5 -0
  24. package/dist/cloud-workspace/runtime/agent-lifecycle.js.map +1 -1
  25. package/dist/cloud-workspace/runtime/agent-opencode-gateway.d.ts +56 -2
  26. package/dist/cloud-workspace/runtime/agent-opencode-gateway.d.ts.map +1 -1
  27. package/dist/cloud-workspace/runtime/agent-opencode-gateway.js +40 -1
  28. package/dist/cloud-workspace/runtime/agent-opencode-gateway.js.map +1 -1
  29. package/dist/cloud-workspace/runtime/agent-opencode.d.ts +2 -2
  30. package/dist/cloud-workspace/runtime/agent-promotion.d.ts +1 -0
  31. package/dist/cloud-workspace/runtime/agent-promotion.d.ts.map +1 -1
  32. package/dist/cloud-workspace/runtime/agent-promotion.js +5 -1
  33. package/dist/cloud-workspace/runtime/agent-promotion.js.map +1 -1
  34. package/dist/cloud-workspace/runtime/agent-source-project.d.ts +126 -0
  35. package/dist/cloud-workspace/runtime/agent-source-project.d.ts.map +1 -0
  36. package/dist/cloud-workspace/runtime/agent-source-project.js +95 -0
  37. package/dist/cloud-workspace/runtime/agent-source-project.js.map +1 -0
  38. package/dist/cloud-workspace/runtime/agent-variant-chat.d.ts +9 -0
  39. package/dist/cloud-workspace/runtime/agent-variant-chat.d.ts.map +1 -0
  40. package/dist/cloud-workspace/runtime/agent-variant-chat.js +23 -0
  41. package/dist/cloud-workspace/runtime/agent-variant-chat.js.map +1 -0
  42. package/dist/cloud-workspace/runtime/agent-variant-git.d.ts +75 -0
  43. package/dist/cloud-workspace/runtime/agent-variant-git.d.ts.map +1 -0
  44. package/dist/cloud-workspace/runtime/agent-variant-git.js +62 -0
  45. package/dist/cloud-workspace/runtime/agent-variant-git.js.map +1 -0
  46. package/dist/cloud-workspace/runtime/capabilities.d.ts +1 -1
  47. package/dist/cloud-workspace/runtime/chat-realtime-admission.d.ts +53 -0
  48. package/dist/cloud-workspace/runtime/chat-realtime-admission.d.ts.map +1 -0
  49. package/dist/cloud-workspace/runtime/chat-realtime-admission.js +95 -0
  50. package/dist/cloud-workspace/runtime/chat-realtime-admission.js.map +1 -0
  51. package/dist/cloud-workspace/runtime/chat-realtime.d.ts +197 -0
  52. package/dist/cloud-workspace/runtime/chat-realtime.d.ts.map +1 -0
  53. package/dist/cloud-workspace/runtime/chat-realtime.js +299 -0
  54. package/dist/cloud-workspace/runtime/chat-realtime.js.map +1 -0
  55. package/dist/cloud-workspace/runtime/errors.d.ts +1 -1
  56. package/dist/cloud-workspace/runtime/git-auth-mode.d.ts +35 -0
  57. package/dist/cloud-workspace/runtime/git-auth-mode.d.ts.map +1 -0
  58. package/dist/cloud-workspace/runtime/git-auth-mode.js +73 -0
  59. package/dist/cloud-workspace/runtime/git-auth-mode.js.map +1 -0
  60. package/dist/cloud-workspace/runtime/handshake.d.ts +1 -1
  61. package/dist/cloud-workspace/runtime/index.d.ts +13 -3
  62. package/dist/cloud-workspace/runtime/index.d.ts.map +1 -1
  63. package/dist/cloud-workspace/runtime/index.js +13 -3
  64. package/dist/cloud-workspace/runtime/index.js.map +1 -1
  65. package/dist/cloud-workspace/runtime/native-history.d.ts +66 -0
  66. package/dist/cloud-workspace/runtime/native-history.d.ts.map +1 -0
  67. package/dist/cloud-workspace/runtime/native-history.js +127 -0
  68. package/dist/cloud-workspace/runtime/native-history.js.map +1 -0
  69. package/dist/cloud-workspace/runtime/operations.d.ts +11 -0
  70. package/dist/cloud-workspace/runtime/operations.d.ts.map +1 -1
  71. package/dist/cloud-workspace/runtime/operations.js +15 -1
  72. package/dist/cloud-workspace/runtime/operations.js.map +1 -1
  73. package/dist/cloud-workspace/runtime/terminal-session.d.ts +78 -0
  74. package/dist/cloud-workspace/runtime/terminal-session.d.ts.map +1 -0
  75. package/dist/cloud-workspace/runtime/terminal-session.js +178 -0
  76. package/dist/cloud-workspace/runtime/terminal-session.js.map +1 -0
  77. package/dist/cloud-workspace/runtime/terminals.d.ts +36 -1
  78. package/dist/cloud-workspace/runtime/terminals.d.ts.map +1 -1
  79. package/dist/cloud-workspace/runtime/terminals.js +46 -1
  80. package/dist/cloud-workspace/runtime/terminals.js.map +1 -1
  81. package/dist/cloud-workspace/runtime/workspace-binding.d.ts +32 -3
  82. package/dist/cloud-workspace/runtime/workspace-binding.d.ts.map +1 -1
  83. package/dist/cloud-workspace/runtime/workspace-binding.js +9 -3
  84. package/dist/cloud-workspace/runtime/workspace-binding.js.map +1 -1
  85. package/dist/database/operators.d.ts +2 -0
  86. package/dist/database/operators.d.ts.map +1 -0
  87. package/dist/database/operators.js +2 -0
  88. package/dist/database/operators.js.map +1 -0
  89. package/package.json +5 -1
  90. package/dist/cloud-workspace/runtime/agent-codebuddy.d.ts +0 -266
  91. package/dist/cloud-workspace/runtime/agent-codebuddy.d.ts.map +0 -1
  92. package/dist/cloud-workspace/runtime/agent-codebuddy.js +0 -189
  93. package/dist/cloud-workspace/runtime/agent-codebuddy.js.map +0 -1
@@ -0,0 +1,197 @@
1
+ import { z } from 'zod';
2
+ export declare const CHAT_REALTIME_V2: "chatRealtimeV2";
3
+ export type ChatRealtimeNegotiation = {
4
+ ok: true;
5
+ mode: typeof CHAT_REALTIME_V2;
6
+ } | {
7
+ ok: false;
8
+ code: 'chat_realtime_unavailable';
9
+ };
10
+ /** Both sides must advertise the mode. Absence keeps history reads and refuses a new realtime turn. */
11
+ export declare function negotiateChatRealtime(input: {
12
+ local: readonly string[];
13
+ remote: readonly string[];
14
+ }): ChatRealtimeNegotiation;
15
+ export declare const TURN_STATUSES: readonly ["starting", "running", "waiting_for_user", "completed", "failed", "interrupted"];
16
+ export type TurnStatus = (typeof TURN_STATUSES)[number];
17
+ export declare function canTransitionTurn(from: TurnStatus, to: TurnStatus): boolean;
18
+ export declare const SAVE_STATUSES: readonly ["syncing", "delayed", "saved", "gap"];
19
+ export type SaveStatus = (typeof SAVE_STATUSES)[number];
20
+ export declare function canTransitionSave(from: SaveStatus, to: SaveStatus): boolean;
21
+ export declare const replayPinEpochSchema: z.ZodObject<{
22
+ runtimeId: z.ZodString;
23
+ generation: z.ZodNumber;
24
+ runtimeEpoch: z.ZodNumber;
25
+ retainedFrom: z.ZodNumber;
26
+ highWater: z.ZodNumber;
27
+ }, z.core.$strict>;
28
+ export type ReplayPinEpoch = z.infer<typeof replayPinEpochSchema>;
29
+ export declare const replayPinResultSchema: z.ZodObject<{
30
+ pinId: z.ZodString;
31
+ epochs: z.ZodArray<z.ZodObject<{
32
+ runtimeId: z.ZodString;
33
+ generation: z.ZodNumber;
34
+ runtimeEpoch: z.ZodNumber;
35
+ retainedFrom: z.ZodNumber;
36
+ highWater: z.ZodNumber;
37
+ }, z.core.$strict>>;
38
+ followBoundary: z.ZodObject<{
39
+ runtimeId: z.ZodString;
40
+ generation: z.ZodNumber;
41
+ runtimeEpoch: z.ZodNumber;
42
+ sourceSequence: z.ZodNumber;
43
+ }, z.core.$strict>;
44
+ }, z.core.$strict>;
45
+ export type ReplayPinResult = z.infer<typeof replayPinResultSchema>;
46
+ export declare const sourceAckEpochSchema: z.ZodObject<{
47
+ runtimeId: z.ZodString;
48
+ generation: z.ZodNumber;
49
+ runtimeEpoch: z.ZodNumber;
50
+ confirmedThrough: z.ZodNumber;
51
+ }, z.core.$strict>;
52
+ export declare const sourceAckSchema: z.ZodObject<{
53
+ leaseFence: z.ZodNumber;
54
+ epochs: z.ZodArray<z.ZodObject<{
55
+ runtimeId: z.ZodString;
56
+ generation: z.ZodNumber;
57
+ runtimeEpoch: z.ZodNumber;
58
+ confirmedThrough: z.ZodNumber;
59
+ }, z.core.$strict>>;
60
+ }, z.core.$strict>;
61
+ export type SourceAck = z.infer<typeof sourceAckSchema>;
62
+ export declare function isMonotonicAck(previous: number, next: number): boolean;
63
+ /** Retained lower bound past the cloud coverage means that prefix can no longer be read. */
64
+ export declare function retainedRangeHasGap(retainedFrom: number, coveredThrough: number): boolean;
65
+ export declare const liveChatFrameSchema: z.ZodObject<{
66
+ source: z.ZodObject<{
67
+ runtimeId: z.ZodString;
68
+ generation: z.ZodNumber;
69
+ runtimeEpoch: z.ZodNumber;
70
+ sourceSequence: z.ZodNumber;
71
+ }, z.core.$strict>;
72
+ sessionId: z.ZodOptional<z.ZodString>;
73
+ workspaceId: z.ZodOptional<z.ZodString>;
74
+ operationId: z.ZodOptional<z.ZodString>;
75
+ type: z.ZodString;
76
+ payload: z.ZodUnknown;
77
+ occurredAt: z.ZodString;
78
+ payloadHash: z.ZodString;
79
+ kind: z.ZodLiteral<"live">;
80
+ persistence: z.ZodLiteral<"local">;
81
+ }, z.core.$strict>;
82
+ export type LiveChatFrame = z.infer<typeof liveChatFrameSchema>;
83
+ export declare const durableChatFrameSchema: z.ZodObject<{
84
+ source: z.ZodObject<{
85
+ runtimeId: z.ZodString;
86
+ generation: z.ZodNumber;
87
+ runtimeEpoch: z.ZodNumber;
88
+ sourceSequence: z.ZodNumber;
89
+ }, z.core.$strict>;
90
+ sessionId: z.ZodOptional<z.ZodString>;
91
+ workspaceId: z.ZodOptional<z.ZodString>;
92
+ operationId: z.ZodOptional<z.ZodString>;
93
+ type: z.ZodString;
94
+ payload: z.ZodUnknown;
95
+ occurredAt: z.ZodString;
96
+ payloadHash: z.ZodString;
97
+ kind: z.ZodLiteral<"durable">;
98
+ streamKind: z.ZodEnum<{
99
+ session: "session";
100
+ runtime: "runtime";
101
+ workspace: "workspace";
102
+ }>;
103
+ streamId: z.ZodString;
104
+ sequence: z.ZodNumber;
105
+ }, z.core.$strict>;
106
+ export type DurableChatFrame = z.infer<typeof durableChatFrameSchema>;
107
+ export declare const chatControlFrameSchema: z.ZodObject<{
108
+ kind: z.ZodLiteral<"control">;
109
+ event: z.ZodEnum<{
110
+ "source.ready": "source.ready";
111
+ "stream.ready": "stream.ready";
112
+ "stream.gap": "stream.gap";
113
+ "save.delayed": "save.delayed";
114
+ }>;
115
+ }, z.core.$strict>;
116
+ export type ChatControlFrame = z.infer<typeof chatControlFrameSchema>;
117
+ export declare const browserChatFrameSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
118
+ source: z.ZodObject<{
119
+ runtimeId: z.ZodString;
120
+ generation: z.ZodNumber;
121
+ runtimeEpoch: z.ZodNumber;
122
+ sourceSequence: z.ZodNumber;
123
+ }, z.core.$strict>;
124
+ sessionId: z.ZodOptional<z.ZodString>;
125
+ workspaceId: z.ZodOptional<z.ZodString>;
126
+ operationId: z.ZodOptional<z.ZodString>;
127
+ type: z.ZodString;
128
+ payload: z.ZodUnknown;
129
+ occurredAt: z.ZodString;
130
+ payloadHash: z.ZodString;
131
+ kind: z.ZodLiteral<"live">;
132
+ persistence: z.ZodLiteral<"local">;
133
+ }, z.core.$strict>, z.ZodObject<{
134
+ source: z.ZodObject<{
135
+ runtimeId: z.ZodString;
136
+ generation: z.ZodNumber;
137
+ runtimeEpoch: z.ZodNumber;
138
+ sourceSequence: z.ZodNumber;
139
+ }, z.core.$strict>;
140
+ sessionId: z.ZodOptional<z.ZodString>;
141
+ workspaceId: z.ZodOptional<z.ZodString>;
142
+ operationId: z.ZodOptional<z.ZodString>;
143
+ type: z.ZodString;
144
+ payload: z.ZodUnknown;
145
+ occurredAt: z.ZodString;
146
+ payloadHash: z.ZodString;
147
+ kind: z.ZodLiteral<"durable">;
148
+ streamKind: z.ZodEnum<{
149
+ session: "session";
150
+ runtime: "runtime";
151
+ workspace: "workspace";
152
+ }>;
153
+ streamId: z.ZodString;
154
+ sequence: z.ZodNumber;
155
+ }, z.core.$strict>, z.ZodObject<{
156
+ kind: z.ZodLiteral<"control">;
157
+ event: z.ZodEnum<{
158
+ "source.ready": "source.ready";
159
+ "stream.ready": "stream.ready";
160
+ "stream.gap": "stream.gap";
161
+ "save.delayed": "save.delayed";
162
+ }>;
163
+ }, z.core.$strict>], "kind">;
164
+ export type BrowserChatFrame = z.infer<typeof browserChatFrameSchema>;
165
+ /** Live and channel-status frames omit the SSE id. Durable uses the public sequence. */
166
+ export declare function encodeSseFrame(frame: BrowserChatFrame): string;
167
+ export type BrowserChatState = {
168
+ ready: boolean;
169
+ gap: boolean;
170
+ seenSourceEvents: string[];
171
+ durableCursor: number;
172
+ texts: string[];
173
+ saveStatus: SaveStatus;
174
+ turnStatus: TurnStatus;
175
+ durableSources: string[];
176
+ };
177
+ export declare function createBrowserChatState(): BrowserChatState;
178
+ export declare function applyBrowserChatFrame(state: BrowserChatState, frame: BrowserChatFrame): BrowserChatState;
179
+ export type ChatRealtimeFixture = {
180
+ readonly turnStatus: TurnStatus;
181
+ readonly frames: readonly BrowserChatFrame[];
182
+ emitText(text: string): LiveChatFrame;
183
+ requestApproval(approvalId: string): LiveChatFrame;
184
+ resumeAfterApproval(): void;
185
+ completeTurn(): LiveChatFrame;
186
+ delayArchive(): ChatControlFrame;
187
+ flushArchive(): DurableChatFrame[];
188
+ };
189
+ export declare function createChatRealtimeFixture(input: {
190
+ runtimeId?: string;
191
+ generation?: number;
192
+ runtimeEpoch?: number;
193
+ sessionId?: string;
194
+ operationId?: string;
195
+ now?: () => string;
196
+ }): ChatRealtimeFixture;
197
+ //# sourceMappingURL=chat-realtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-realtime.d.ts","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/chat-realtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,299 @@
1
+ import { z } from 'zod';
2
+ import { eventStreamKindSchema, sourceEventIdSchema, sourceEventKey } from './events.js';
3
+ import { hashOperationPayload } from './operations.js';
4
+ export const CHAT_REALTIME_V2 = 'chatRealtimeV2';
5
+ /** Both sides must advertise the mode. Absence keeps history reads and refuses a new realtime turn. */
6
+ export function negotiateChatRealtime(input) {
7
+ if (input.local.includes(CHAT_REALTIME_V2) && input.remote.includes(CHAT_REALTIME_V2)) {
8
+ return { ok: true, mode: CHAT_REALTIME_V2 };
9
+ }
10
+ return { ok: false, code: 'chat_realtime_unavailable' };
11
+ }
12
+ export const TURN_STATUSES = [
13
+ 'starting',
14
+ 'running',
15
+ 'waiting_for_user',
16
+ 'completed',
17
+ 'failed',
18
+ 'interrupted',
19
+ ];
20
+ const TURN_TRANSITIONS = {
21
+ starting: ['running', 'failed', 'interrupted'],
22
+ running: ['waiting_for_user', 'completed', 'failed', 'interrupted'],
23
+ waiting_for_user: ['running', 'failed', 'interrupted'],
24
+ completed: [],
25
+ failed: [],
26
+ interrupted: [],
27
+ };
28
+ export function canTransitionTurn(from, to) {
29
+ return TURN_TRANSITIONS[from].includes(to);
30
+ }
31
+ export const SAVE_STATUSES = ['syncing', 'delayed', 'saved', 'gap'];
32
+ const SAVE_TRANSITIONS = {
33
+ syncing: ['delayed', 'saved', 'gap'],
34
+ delayed: ['syncing', 'saved', 'gap'],
35
+ saved: ['syncing', 'delayed', 'gap'],
36
+ gap: [],
37
+ };
38
+ export function canTransitionSave(from, to) {
39
+ return SAVE_TRANSITIONS[from].includes(to);
40
+ }
41
+ const sourceEpochSchema = z
42
+ .object({
43
+ runtimeId: z.string().min(1).max(128),
44
+ generation: z.number().int().nonnegative(),
45
+ runtimeEpoch: z.number().int().nonnegative(),
46
+ })
47
+ .strict();
48
+ export const replayPinEpochSchema = sourceEpochSchema
49
+ .safeExtend({
50
+ retainedFrom: z.number().int().positive(),
51
+ highWater: z.number().int().nonnegative(),
52
+ })
53
+ .strict();
54
+ export const replayPinResultSchema = z
55
+ .object({
56
+ pinId: z.string().min(1).max(128),
57
+ epochs: z.array(replayPinEpochSchema).min(1),
58
+ followBoundary: sourceEventIdSchema,
59
+ })
60
+ .strict();
61
+ export const sourceAckEpochSchema = sourceEpochSchema
62
+ .safeExtend({
63
+ confirmedThrough: z.number().int().nonnegative(),
64
+ })
65
+ .strict();
66
+ export const sourceAckSchema = z
67
+ .object({
68
+ leaseFence: z.number().int().nonnegative(),
69
+ epochs: z.array(sourceAckEpochSchema).min(1),
70
+ })
71
+ .strict();
72
+ export function isMonotonicAck(previous, next) {
73
+ return Number.isInteger(previous) && Number.isInteger(next) && next >= previous && previous >= 0;
74
+ }
75
+ /** Retained lower bound past the cloud coverage means that prefix can no longer be read. */
76
+ export function retainedRangeHasGap(retainedFrom, coveredThrough) {
77
+ return retainedFrom > coveredThrough + 1;
78
+ }
79
+ const frameBodySchema = {
80
+ source: sourceEventIdSchema,
81
+ sessionId: z.string().min(1).max(128).optional(),
82
+ workspaceId: z.string().min(1).max(128).optional(),
83
+ operationId: z.string().min(1).max(128).optional(),
84
+ type: z.string().min(1).max(128),
85
+ payload: z.unknown(),
86
+ occurredAt: z.string().min(1),
87
+ payloadHash: z.string().length(64),
88
+ };
89
+ export const liveChatFrameSchema = z
90
+ .object({
91
+ kind: z.literal('live'),
92
+ persistence: z.literal('local'),
93
+ ...frameBodySchema,
94
+ })
95
+ .strict();
96
+ export const durableChatFrameSchema = z
97
+ .object({
98
+ kind: z.literal('durable'),
99
+ streamKind: eventStreamKindSchema,
100
+ streamId: z.string().min(1).max(128),
101
+ sequence: z.number().int().positive(),
102
+ ...frameBodySchema,
103
+ })
104
+ .strict();
105
+ export const chatControlFrameSchema = z
106
+ .object({
107
+ kind: z.literal('control'),
108
+ event: z.enum(['source.ready', 'stream.ready', 'stream.gap', 'save.delayed']),
109
+ })
110
+ .strict();
111
+ export const browserChatFrameSchema = z.discriminatedUnion('kind', [
112
+ liveChatFrameSchema,
113
+ durableChatFrameSchema,
114
+ chatControlFrameSchema,
115
+ ]);
116
+ /** Live and channel-status frames omit the SSE id. Durable uses the public sequence. */
117
+ export function encodeSseFrame(frame) {
118
+ const parsed = browserChatFrameSchema.parse(frame);
119
+ const data = JSON.stringify(parsed);
120
+ if (parsed.kind === 'durable') {
121
+ return `id: ${parsed.sequence}\nevent: durable\ndata: ${data}\n\n`;
122
+ }
123
+ if (parsed.kind === 'live') {
124
+ return `event: live\ndata: ${data}\n\n`;
125
+ }
126
+ return `event: ${parsed.event}\ndata: ${data}\n\n`;
127
+ }
128
+ export function createBrowserChatState() {
129
+ return {
130
+ ready: false,
131
+ gap: false,
132
+ seenSourceEvents: [],
133
+ durableCursor: 0,
134
+ texts: [],
135
+ saveStatus: 'syncing',
136
+ turnStatus: 'starting',
137
+ durableSources: [],
138
+ };
139
+ }
140
+ function textOf(payload) {
141
+ if (!payload || typeof payload !== 'object' || !('text' in payload))
142
+ return undefined;
143
+ const text = payload.text;
144
+ return typeof text === 'string' ? text : undefined;
145
+ }
146
+ function nextTurn(current, type) {
147
+ if (type === 'approval.requested' && canTransitionTurn(current, 'waiting_for_user'))
148
+ return 'waiting_for_user';
149
+ if (type === 'message.delta' && canTransitionTurn(current, 'running'))
150
+ return 'running';
151
+ if (type === 'turn.completed' && canTransitionTurn(current, 'completed'))
152
+ return 'completed';
153
+ if (type === 'turn.failed' && canTransitionTurn(current, 'failed'))
154
+ return 'failed';
155
+ if (type === 'turn.interrupted' && canTransitionTurn(current, 'interrupted'))
156
+ return 'interrupted';
157
+ return current;
158
+ }
159
+ function nextSave(current, to) {
160
+ return canTransitionSave(current, to) ? to : current;
161
+ }
162
+ export function applyBrowserChatFrame(state, frame) {
163
+ const parsed = browserChatFrameSchema.parse(frame);
164
+ if (parsed.kind === 'control') {
165
+ if (parsed.event === 'source.ready')
166
+ return state;
167
+ if (parsed.event === 'stream.gap')
168
+ return { ...state, gap: true, ready: false, saveStatus: nextSave(state.saveStatus, 'gap') };
169
+ if (parsed.event === 'save.delayed')
170
+ return { ...state, saveStatus: nextSave(state.saveStatus, 'delayed') };
171
+ if (state.gap)
172
+ return state;
173
+ return { ...state, ready: true };
174
+ }
175
+ if (parsed.kind === 'durable' && parsed.sequence <= state.durableCursor)
176
+ return state;
177
+ if (parsed.kind === 'durable' && parsed.sequence !== state.durableCursor + 1) {
178
+ return {
179
+ ...state,
180
+ gap: true,
181
+ ready: false,
182
+ saveStatus: nextSave(state.saveStatus, 'gap'),
183
+ };
184
+ }
185
+ const key = sourceEventKey(parsed.source);
186
+ const seen = state.seenSourceEvents.includes(key);
187
+ const texts = !seen && parsed.type === 'message.delta' ? [...state.texts, textOf(parsed.payload) ?? ''] : state.texts;
188
+ const seenSourceEvents = seen ? state.seenSourceEvents : [...state.seenSourceEvents, key];
189
+ const turnStatus = seen ? state.turnStatus : nextTurn(state.turnStatus, parsed.type);
190
+ if (parsed.kind === 'live') {
191
+ const keep = state.saveStatus === 'gap' || state.saveStatus === 'delayed' || state.durableSources.includes(key);
192
+ const saveStatus = keep ? state.saveStatus : nextSave(state.saveStatus, 'syncing');
193
+ return { ...state, texts, seenSourceEvents, turnStatus, saveStatus };
194
+ }
195
+ const durableSources = state.durableSources.includes(key) ? state.durableSources : [...state.durableSources, key];
196
+ const archiveCaughtUp = seenSourceEvents.every((item) => durableSources.includes(item));
197
+ const saveTarget = archiveCaughtUp ? 'saved' : state.saveStatus === 'delayed' ? 'delayed' : 'syncing';
198
+ return {
199
+ ...state,
200
+ texts,
201
+ seenSourceEvents,
202
+ turnStatus,
203
+ durableSources,
204
+ durableCursor: parsed.sequence,
205
+ saveStatus: state.saveStatus === 'gap' ? 'gap' : nextSave(state.saveStatus, saveTarget),
206
+ };
207
+ }
208
+ export function createChatRealtimeFixture(input) {
209
+ const runtimeId = input.runtimeId ?? 'rt_1';
210
+ const generation = input.generation ?? 1;
211
+ const runtimeEpoch = input.runtimeEpoch ?? 1;
212
+ const sessionId = input.sessionId ?? 'session_1';
213
+ const operationId = input.operationId ?? 'op_1';
214
+ const now = input.now ?? (() => '2026-09-24T00:00:00.000Z');
215
+ const frames = [];
216
+ const pending = [];
217
+ let sequence = 0;
218
+ let turnStatus = 'starting';
219
+ let publicSequence = 0;
220
+ function source() {
221
+ sequence += 1;
222
+ return { runtimeId, generation, runtimeEpoch, sourceSequence: sequence };
223
+ }
224
+ function pushLive(type, payload) {
225
+ const frame = liveChatFrameSchema.parse({
226
+ kind: 'live',
227
+ persistence: 'local',
228
+ source: source(),
229
+ sessionId,
230
+ operationId,
231
+ type,
232
+ payload,
233
+ occurredAt: now(),
234
+ payloadHash: hashOperationPayload(payload),
235
+ });
236
+ frames.push(frame);
237
+ pending.push(frame);
238
+ return frame;
239
+ }
240
+ return {
241
+ get turnStatus() {
242
+ return turnStatus;
243
+ },
244
+ get frames() {
245
+ return frames;
246
+ },
247
+ emitText(text) {
248
+ if (turnStatus !== 'starting' && turnStatus !== 'running') {
249
+ throw new Error(`turn_not_generating:${turnStatus}`);
250
+ }
251
+ turnStatus = 'running';
252
+ return pushLive('message.delta', { text });
253
+ },
254
+ requestApproval(approvalId) {
255
+ if (turnStatus !== 'running')
256
+ throw new Error(`approval_requires_running:${turnStatus}`);
257
+ turnStatus = 'waiting_for_user';
258
+ return pushLive('approval.requested', { approvalId });
259
+ },
260
+ resumeAfterApproval() {
261
+ if (turnStatus !== 'waiting_for_user')
262
+ throw new Error(`approval_not_waiting:${turnStatus}`);
263
+ turnStatus = 'running';
264
+ },
265
+ completeTurn() {
266
+ if (turnStatus !== 'running')
267
+ throw new Error(`turn_not_running:${turnStatus}`);
268
+ turnStatus = 'completed';
269
+ return pushLive('turn.completed', {});
270
+ },
271
+ delayArchive() {
272
+ const frame = chatControlFrameSchema.parse({ kind: 'control', event: 'save.delayed' });
273
+ frames.push(frame);
274
+ return frame;
275
+ },
276
+ flushArchive() {
277
+ const archived = pending.splice(0).map((live) => {
278
+ publicSequence += 1;
279
+ const durable = durableChatFrameSchema.parse({
280
+ kind: 'durable',
281
+ streamKind: 'session',
282
+ streamId: sessionId,
283
+ sequence: publicSequence,
284
+ source: live.source,
285
+ sessionId: live.sessionId,
286
+ operationId: live.operationId,
287
+ type: live.type,
288
+ payload: live.payload,
289
+ occurredAt: live.occurredAt,
290
+ payloadHash: live.payloadHash,
291
+ });
292
+ frames.push(durable);
293
+ return durable;
294
+ });
295
+ return archived;
296
+ },
297
+ };
298
+ }
299
+ //# sourceMappingURL=chat-realtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-realtime.js","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/chat-realtime.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,9 @@ export declare const RUNTIME_ERROR_CODES: readonly ["protocol_incompatible", "un
3
3
  export type RuntimeErrorCode = (typeof RUNTIME_ERROR_CODES)[number];
4
4
  export declare const runtimeErrorSchema: z.ZodObject<{
5
5
  code: z.ZodEnum<{
6
+ protocol_incompatible: "protocol_incompatible";
6
7
  generation_mismatch: "generation_mismatch";
7
8
  stale_lease: "stale_lease";
8
- protocol_incompatible: "protocol_incompatible";
9
9
  unauthenticated: "unauthenticated";
10
10
  untrusted_runtime_field: "untrusted_runtime_field";
11
11
  idempotency_conflict: "idempotency_conflict";
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ /** Authentication mode names mirror the external configuration/protocol values defined here. */
3
+ export declare const WORKSPACE_GIT_AUTH_MODE: {
4
+ readonly LOCAL: "local";
5
+ readonly GATEWAY: "gateway";
6
+ };
7
+ export declare const workspaceGitAuthModeSchema: z.ZodEnum<{
8
+ readonly LOCAL: "local";
9
+ readonly GATEWAY: "gateway";
10
+ }>;
11
+ export type WorkspaceGitAuthMode = z.infer<typeof workspaceGitAuthModeSchema>;
12
+ export declare const DEFAULT_WORKSPACE_GIT_AUTH_MODE: "gateway";
13
+ export type WorkspaceGitAuthConfig = {
14
+ mode: WorkspaceGitAuthMode;
15
+ origin?: string;
16
+ token?: string;
17
+ };
18
+ /** Classify an explicit mode; missing values do not imply a mode or grant authorization. */
19
+ export declare function isLocalWorkspaceGitAuthMode(mode: WorkspaceGitAuthMode | undefined): mode is typeof WORKSPACE_GIT_AUTH_MODE.LOCAL;
20
+ export declare function isGatewayWorkspaceGitAuthMode(mode: WorkspaceGitAuthMode | undefined): mode is typeof WORKSPACE_GIT_AUTH_MODE.GATEWAY;
21
+ /** Logical ownership is separate from authentication mode. Matches local and local-<hostname> owners. */
22
+ export declare function isLocalWorkspaceGitEnvironment(environment: string | undefined): boolean;
23
+ export declare function assertGitCredentialControlUrl(value: string): void;
24
+ /** Backend startup guard. Logical environment and deployment runtime must both be local. */
25
+ export declare function readWorkspaceGitAuthConfig(env: Record<string, string | undefined>, requireToken?: boolean): WorkspaceGitAuthConfig;
26
+ /** Exact trusted origin and canonical repository path; loopback exists solely for isolated tests. */
27
+ export declare function assertDirectGitRepository(repositoryUrl: string, origin: string): void;
28
+ export declare const workspaceGitDirectAccessSchema: z.ZodObject<{
29
+ repositoryUrl: z.ZodString;
30
+ origin: z.ZodString;
31
+ username: z.ZodString;
32
+ password: z.ZodString;
33
+ }, z.core.$strict>;
34
+ export type WorkspaceGitDirectAccess = z.infer<typeof workspaceGitDirectAccessSchema>;
35
+ //# sourceMappingURL=git-auth-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-auth-mode.d.ts","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/git-auth-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,gGAAgG;AAChG,eAAO,MAAM,uBAAuB;;;CAG1B,CAAC;AACX,eAAO,MAAM,0BAA0B;;;EAAkC,CAAC;AAC1E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAC9E,eAAO,MAAM,+BAA+B,WAAkC,CAAC;AAC/E,MAAM,MAAM,sBAAsB,GAAG;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErG,4FAA4F;AAC5F,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,oBAAoB,GAAG,SAAS,GAAG,IAAI,IAAI,OAAO,uBAAuB,CAAC,KAAK,CAEhI;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,oBAAoB,GAAG,SAAS,GAAG,IAAI,IAAI,OAAO,uBAAuB,CAAC,OAAO,CAEpI;AAED,yGAAyG;AACzG,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEvF;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAMjE;AAED,4FAA4F;AAC5F,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,YAAY,UAAQ,GAAG,sBAAsB,CAkBhI;AAED,qGAAqG;AACrG,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQrF;AAED,eAAO,MAAM,8BAA8B;;;;;kBAOzC,CAAC;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { z } from 'zod';
2
+ /** Authentication mode names mirror the external configuration/protocol values defined here. */
3
+ export const WORKSPACE_GIT_AUTH_MODE = {
4
+ LOCAL: 'local',
5
+ GATEWAY: 'gateway',
6
+ };
7
+ export const workspaceGitAuthModeSchema = z.enum(WORKSPACE_GIT_AUTH_MODE);
8
+ export const DEFAULT_WORKSPACE_GIT_AUTH_MODE = WORKSPACE_GIT_AUTH_MODE.GATEWAY;
9
+ /** Classify an explicit mode; missing values do not imply a mode or grant authorization. */
10
+ export function isLocalWorkspaceGitAuthMode(mode) {
11
+ return mode === WORKSPACE_GIT_AUTH_MODE.LOCAL;
12
+ }
13
+ export function isGatewayWorkspaceGitAuthMode(mode) {
14
+ return mode === WORKSPACE_GIT_AUTH_MODE.GATEWAY;
15
+ }
16
+ /** Logical ownership is separate from authentication mode. Matches local and local-<hostname> owners. */
17
+ export function isLocalWorkspaceGitEnvironment(environment) {
18
+ return environment !== undefined && /^local(?:-[a-zA-Z0-9][a-zA-Z0-9_-]*)?$/.test(environment);
19
+ }
20
+ export function assertGitCredentialControlUrl(value) {
21
+ const url = new URL(value);
22
+ if (url.username || url.password || url.search || url.hash
23
+ || !(url.protocol === 'https:' || (url.protocol === 'http:' && ['127.0.0.1', 'localhost', '[::1]'].includes(url.hostname)))) {
24
+ throw new Error('workspace_git_control_transport_rejected');
25
+ }
26
+ }
27
+ /** Backend startup guard. Logical environment and deployment runtime must both be local. */
28
+ export function readWorkspaceGitAuthConfig(env, requireToken = false) {
29
+ const parsed = workspaceGitAuthModeSchema.safeParse(env.WORKSPACE_GIT_AUTH_MODE ?? DEFAULT_WORKSPACE_GIT_AUTH_MODE);
30
+ if (!parsed.success)
31
+ throw new Error('Invalid WORKSPACE_GIT_AUTH_MODE');
32
+ const mode = parsed.data;
33
+ if (isGatewayWorkspaceGitAuthMode(mode))
34
+ return { mode };
35
+ if (env.NODE_ENV !== 'development'
36
+ || !isLocalWorkspaceGitEnvironment(env.AGENT_OWNER_ENV || env.PLAYCRAFT_ENV)
37
+ || [env.AGENT_OWNER_ENV, env.PLAYCRAFT_ENV].some(value => value && !isLocalWorkspaceGitEnvironment(value))
38
+ || env.KUBERNETES_SERVICE_HOST || env.KUBERNETES_SERVICE_PORT) {
39
+ throw new Error('Direct workspace Git authentication requires local development outside Kubernetes');
40
+ }
41
+ const origin = env.WORKSPACE_GIT_GONGFENG_ORIGIN || 'https://git.tencent.com';
42
+ assertDirectGitRepository(`${origin}/validation/repository.git`, origin);
43
+ const token = requireToken ? env.GIT_TENCENT_PRIVATE_TOKEN : undefined;
44
+ if (requireToken && (!token || token.length > 8192 || /[\r\n\0:]/.test(token))) {
45
+ throw new Error('Invalid GIT_TENCENT_PRIVATE_TOKEN');
46
+ }
47
+ return { mode, origin, ...(token ? { token } : {}) };
48
+ }
49
+ /** Exact trusted origin and canonical repository path; loopback exists solely for isolated tests. */
50
+ export function assertDirectGitRepository(repositoryUrl, origin) {
51
+ const url = new URL(repositoryUrl);
52
+ if (url.origin !== origin || url.href !== repositoryUrl || url.username || url.password || url.search || url.hash
53
+ || !/^\/[a-zA-Z0-9_-]+(?:\/[a-zA-Z0-9_.-]+)+\.git$/.test(url.pathname)
54
+ || url.pathname.split('/').some(part => part === '..' || part === '.')
55
+ || !(url.protocol === 'https:' || (url.protocol === 'http:' && ['127.0.0.1', 'localhost', '[::1]'].includes(url.hostname)))) {
56
+ throw new Error('workspace_git_direct_repository_rejected');
57
+ }
58
+ }
59
+ export const workspaceGitDirectAccessSchema = z.object({
60
+ repositoryUrl: z.string().min(1).max(2048),
61
+ origin: z.string().min(1).max(256),
62
+ username: z.string().min(1).max(256).regex(/^[^:\r\n\0]+$/),
63
+ password: z.string().min(1).max(8192).regex(/^[^\r\n\0]+$/),
64
+ }).strict().refine(value => {
65
+ try {
66
+ assertDirectGitRepository(value.repositoryUrl, value.origin);
67
+ return true;
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ });
73
+ //# sourceMappingURL=git-auth-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-auth-mode.js","sourceRoot":"","sources":["../../../src/cloud-workspace/runtime/git-auth-mode.ts"],"names":[],"mappings":"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"}