iterate 0.2.4 → 0.2.6
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.
- package/LICENSE +661 -0
- package/README.md +40 -77
- package/bin/iterate.js +31 -584
- package/dist/cli-DMS4kJph.mjs +868 -0
- package/dist/cli-DMS4kJph.mjs.map +1 -0
- package/dist/config-DtnR7Lv7.mjs +170 -0
- package/dist/config-DtnR7Lv7.mjs.map +1 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +8 -0
- package/dist/index.mjs.map +1 -0
- package/dist/stream-tui/agent-chat-terminal.d.mts +1 -0
- package/dist/stream-tui/agent-chat-terminal.mjs +933 -0
- package/dist/stream-tui/agent-chat-terminal.mjs.map +1 -0
- package/dist/worker.d.mts +33 -0
- package/dist/worker.mjs +18 -0
- package/dist/worker.mjs.map +1 -0
- package/package.json +38 -15
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-chat-terminal.mjs","names":[],"sources":["../../../ui/src/components/events/agent-ui-reducer.ts","../../src/stream-tui/agent-feed-model.ts","../../src/stream-tui/agent-connection.ts","../../src/stream-tui/feed-format.ts","../../src/stream-tui/agent-chat-terminal.tsx"],"sourcesContent":["import type { Event } from \"./types.ts\";\n\n// ---------------------------------------------------------------------------\n// Reduced state model + pure batch planner\n//\n// The agent UI is a clean chat: user message → activity (\"Ran code 2× · 3\n// requests · 7.4 s\") → assistant message. SETTLED items are emitted as ops\n// that the agent-ui processor writes into the `agent_feed_items` SQLite\n// table (the TanStack virtual list reads those rows); the reduced state holds\n// only what is still in flight — the live activity with partially streamed\n// thinking/response text, the presence roster, and the next dense row index.\n// The live part renders as one element below the list, straight from this\n// state.\n//\n// Mirrors `browser-event-feed`'s planFeedOps contract: `reduce` advances\n// state one event at a time, `processEventBatch` plans the whole batch from\n// the same entry state to produce one idempotent SQLite transaction.\n// ---------------------------------------------------------------------------\n\nexport type AgentUiLlmStep = {\n kind: \"llm\";\n id: string;\n llmRequestId: number;\n status: \"running\" | \"done\";\n model?: string;\n provider?: string;\n /** Streamed reasoning summary (\"thinking\") text. */\n thinkingText: string;\n /** Streamed response text — for code-mode agents this is source code. */\n responseText: string;\n inputTokens?: number;\n outputTokens?: number;\n durationMs?: number;\n outcome?: \"completed\" | \"failed\" | \"cancelled\";\n errorMessage?: string;\n providerResponseId?: string;\n startedAtMs: number;\n};\n\nexport type AgentUiCodeStep = {\n kind: \"code\";\n id: string;\n executionId: string;\n status: \"running\" | \"done\";\n code: string;\n result?: unknown;\n errorMessage?: string;\n logs?: string[];\n durationMs?: number;\n success?: boolean;\n startedAtMs: number;\n};\n\nexport type AgentUiStep = AgentUiLlmStep | AgentUiCodeStep;\n\nexport type AgentUiActivity = {\n kind: \"activity\";\n id: string;\n /**\n * \"waiting\" = the agent went idle but no chat message has settled the\n * activity yet — further rounds roll into it (\"Ran code 3× · 3 requests\").\n */\n status: \"running\" | \"waiting\" | \"done\";\n steps: AgentUiStep[];\n startedAtMs: number;\n endedAtMs?: number;\n};\n\nexport type AgentUiMessageItem = {\n kind: \"user\" | \"assistant\";\n id: string;\n text: string;\n timestampMs: number;\n};\n\nexport type AgentUiItem = AgentUiMessageItem | AgentUiActivity;\n\nexport type AgentUiProcessorAnnouncement = {\n slug: string;\n version: string;\n description: string;\n consumes: string[];\n emits: string[];\n ownedEvents: Array<{ type: string; description?: string }>;\n};\n\nexport type AgentUiPresenceEntry = {\n subscriptionKey: string;\n direction: \"inbound\" | \"outbound\";\n connected: boolean;\n description?: string;\n processor?: AgentUiProcessorAnnouncement;\n};\n\nexport type AgentUiState = {\n /** The running activity (streaming thinking/code), or null when idle. */\n live: AgentUiActivity | null;\n /** User messages that landed while the current request was already running. */\n queuedUserMessages: AgentUiMessageItem[];\n eventCount: number;\n /** Connection roster reduced from subscriber-connected/disconnected facts. */\n presence: AgentUiPresenceEntry[];\n /** Dense, monotonically increasing next agent_feed_items local_index. */\n nextLocalIndex: number;\n};\n\nexport function initialAgentUiState(): AgentUiState {\n return { live: null, queuedUserMessages: [], eventCount: 0, presence: [], nextLocalIndex: 0 };\n}\n\n/** One settled item to upsert at a dense list position. */\nexport type AgentUiOp = { localIndex: number; item: AgentUiItem };\n\n/**\n * Fold a batch of events into settled-item ops + the resulting state.\n * Idempotent by construction: replaying the same events from the same entry\n * state yields the same ops, and the processor upserts by local_index.\n */\nexport function planAgentUiOps(\n start: AgentUiState,\n events: readonly Event[],\n): { endState: AgentUiState; ops: AgentUiOp[] } {\n const ops: AgentUiOp[] = [];\n let state = start;\n for (const event of events) state = reduceAgentUiEvent(state, event, ops);\n return { endState: state, ops };\n}\n\n/** Append a settled item op at the next dense position. */\nfunction emitItem(state: AgentUiState, ops: AgentUiOp[], item: AgentUiItem): AgentUiState {\n ops.push({ localIndex: state.nextLocalIndex, item });\n return { ...state, nextLocalIndex: state.nextLocalIndex + 1 };\n}\n\n// ---------------------------------------------------------------------------\n// Event types\n// ---------------------------------------------------------------------------\n\nconst AGENT_LLM_REQUEST_REQUESTED = \"events.iterate.com/agent/llm-request-requested\";\nconst AGENT_LLM_REQUEST_COMPLETED = \"events.iterate.com/agent/llm-request-completed\";\nconst AGENT_LLM_REQUEST_CANCELLED = \"events.iterate.com/agent/llm-request-cancelled\";\nconst AGENT_OUTPUT_ADDED = \"events.iterate.com/agent/output-added\";\nconst AGENT_STATUS_UPDATED = \"events.iterate.com/agent/status-updated\";\nconst OPENAI_WS_REQUEST_STARTED = \"events.iterate.com/openai-ws/llm-request-started\";\n// The openai-ws processor journals every raw Responses-WS frame as\n// llm-response-chunk ({llmRequestId, sequence, chunk}); the frames stream\n// into the live activity below.\nconst OPENAI_WS_RESPONSE_CHUNK = \"events.iterate.com/openai-ws/llm-response-chunk\";\nconst CLOUDFLARE_AI_REQUEST_STARTED = \"events.iterate.com/cloudflare-ai/llm-request-started\";\nconst CLOUDFLARE_AI_RESPONSE_CHUNK = \"events.iterate.com/cloudflare-ai/llm-response-chunk\";\nconst SCRIPT_EXECUTION_REQUESTED = \"events.iterate.com/capability-host/script-execution-requested\";\nconst SCRIPT_EXECUTION_COMPLETED = \"events.iterate.com/capability-host/script-execution-completed\";\nconst CODEMODE_SCRIPT_EXECUTION_REQUESTED =\n \"events.iterate.com/codemode/script-execution-requested\";\nconst CODEMODE_SCRIPT_EXECUTION_COMPLETED =\n \"events.iterate.com/codemode/script-execution-completed\";\nconst STREAM_SUBSCRIBER_CONNECTED = \"events.iterate.com/stream/subscriber-connected\";\nconst STREAM_SUBSCRIBER_DISCONNECTED = \"events.iterate.com/stream/subscriber-disconnected\";\nconst STREAM_WOKEN = \"events.iterate.com/stream/woken\";\n\n// ---------------------------------------------------------------------------\n// Reducer\n// ---------------------------------------------------------------------------\n\nfunction reduceAgentUiEvent(previous: AgentUiState, event: Event, ops: AgentUiOp[]): AgentUiState {\n const state: AgentUiState = {\n ...previous,\n queuedUserMessages: previous.queuedUserMessages ?? [],\n eventCount: previous.eventCount + 1,\n };\n const timestampMs = Date.parse(event.createdAt);\n\n switch (event.type) {\n case \"events.iterate.com/agents/user-message-received\": {\n const text = readString(event, \"content\");\n if (text == null) return state;\n // A user message while steps are still running must not archive those\n // steps as finished — the agent is still working. Only a quiescent live\n // activity settles here; an active one keeps streaming and settles on\n // its own terminal event.\n const hasRunningStep = state.live?.steps.some((step) => step.status === \"running\") ?? false;\n const item: AgentUiMessageItem = {\n kind: \"user\",\n id: `user-${event.offset}`,\n text,\n timestampMs,\n };\n if (hasRunningStep) {\n return { ...state, queuedUserMessages: [...state.queuedUserMessages, item] };\n }\n const base = hasRunningStep ? state : settleLive(state, timestampMs, ops);\n return emitItem(base, ops, item);\n }\n\n case \"events.iterate.com/agents/web-message-sent\":\n case \"events.iterate.com/agents/tui-message-sent\": {\n const text = readString(event, \"message\");\n if (text == null) return state;\n const settled = settleLive(state, timestampMs, ops);\n return emitItem(settled, ops, {\n kind: \"assistant\",\n id: `assistant-${event.offset}`,\n text,\n timestampMs,\n });\n }\n\n case AGENT_LLM_REQUEST_REQUESTED: {\n const base =\n state.queuedUserMessages.length === 0\n ? state\n : flushQueuedUserMessages(settleLive(state, timestampMs, ops), ops);\n const live = ensureLive(base, event.offset, timestampMs);\n const model = readString(event, \"model\");\n const step: AgentUiLlmStep = {\n kind: \"llm\",\n id: `llm-${event.offset}`,\n llmRequestId: event.offset,\n status: \"running\",\n ...(model == null ? {} : { model }),\n thinkingText: \"\",\n responseText: \"\",\n startedAtMs: timestampMs,\n };\n return { ...base, live: { ...live, steps: [...live.steps, step] } };\n }\n\n case OPENAI_WS_REQUEST_STARTED:\n case CLOUDFLARE_AI_REQUEST_STARTED: {\n const llmRequestId = readNumber(event, \"llmRequestId\");\n const model = readString(event, \"model\");\n if (llmRequestId == null || model == null) return state;\n return updateLlmStep(state, llmRequestId, (step) => ({ ...step, model }));\n }\n\n case OPENAI_WS_RESPONSE_CHUNK: {\n const llmRequestId = readNumber(event, \"llmRequestId\");\n const message = readRecord(event, \"chunk\");\n if (llmRequestId == null || message == null) return state;\n const frameType = typeof message.type === \"string\" ? message.type : \"\";\n const delta = typeof message.delta === \"string\" ? message.delta : \"\";\n\n if (frameType === \"response.output_text.delta\" && delta !== \"\") {\n return updateLlmStep(state, llmRequestId, (step) => ({\n ...step,\n responseText: step.status === \"running\" ? step.responseText + delta : step.responseText,\n }));\n }\n if (\n (frameType === \"response.reasoning_summary_text.delta\" ||\n frameType === \"response.reasoning_text.delta\") &&\n delta !== \"\"\n ) {\n return updateLlmStep(state, llmRequestId, (step) => ({\n ...step,\n thinkingText: step.status === \"running\" ? step.thinkingText + delta : step.thinkingText,\n }));\n }\n if (frameType === \"response.reasoning_summary_part.added\") {\n return updateLlmStep(state, llmRequestId, (step) => ({\n ...step,\n thinkingText:\n step.status !== \"running\" || step.thinkingText === \"\"\n ? step.thinkingText\n : `${step.thinkingText}\\n\\n`,\n }));\n }\n return state;\n }\n\n case CLOUDFLARE_AI_RESPONSE_CHUNK: {\n const llmRequestId = readNumber(event, \"llmRequestId\");\n const chunk = readPayloadRecord(event)?.chunk;\n if (llmRequestId == null) return state;\n const { responseDelta, thinkingDelta } = extractCloudflareChunkDeltas(chunk);\n if (responseDelta === \"\" && thinkingDelta === \"\") return state;\n return updateLlmStep(state, llmRequestId, (step) => ({\n ...step,\n responseText:\n step.status === \"running\" ? step.responseText + responseDelta : step.responseText,\n thinkingText:\n step.status === \"running\" ? step.thinkingText + thinkingDelta : step.thinkingText,\n }));\n }\n\n case AGENT_OUTPUT_ADDED: {\n const llmRequestId = readNumber(event, \"llmRequestId\");\n const content = readString(event, \"content\");\n if (llmRequestId == null || content == null) return state;\n // Authoritative full text: replaces whatever streamed in (or fills it\n // in for providers that never streamed).\n return updateLlmStep(state, llmRequestId, (step) =>\n step.status === \"running\" ? { ...step, responseText: content } : step,\n );\n }\n\n case AGENT_LLM_REQUEST_COMPLETED: {\n const llmRequestId = readNumber(event, \"llmRequestId\");\n if (llmRequestId == null) return state;\n const payload = readPayloadRecord(event);\n const result = isRecord(payload?.result) ? payload.result : undefined;\n const status = typeof result?.status === \"string\" ? result.status : \"success\";\n const usage = readUsageTokens(result?.usage);\n const errorMessage =\n isRecord(result?.error) && typeof result.error.message === \"string\"\n ? result.error.message\n : undefined;\n return updateLlmStep(state, llmRequestId, (step) =>\n step.outcome === \"cancelled\"\n ? step\n : {\n ...step,\n status: \"done\",\n outcome: status === \"success\" ? \"completed\" : \"failed\",\n ...(typeof payload?.provider === \"string\" ? { provider: payload.provider } : {}),\n ...(typeof payload?.durationMs === \"number\"\n ? { durationMs: payload.durationMs }\n : {}),\n ...(usage.input == null ? {} : { inputTokens: usage.input }),\n ...(usage.output == null ? {} : { outputTokens: usage.output }),\n ...(errorMessage == null ? {} : { errorMessage }),\n ...(typeof result?.providerResponseId === \"string\"\n ? { providerResponseId: result.providerResponseId }\n : {}),\n },\n );\n }\n\n case AGENT_LLM_REQUEST_CANCELLED: {\n const llmRequestId = readNumber(event, \"llmRequestId\");\n if (llmRequestId == null) return state;\n return updateLlmStep(state, llmRequestId, (step) => ({\n ...step,\n status: \"done\",\n outcome: \"cancelled\",\n }));\n }\n\n case SCRIPT_EXECUTION_REQUESTED:\n case CODEMODE_SCRIPT_EXECUTION_REQUESTED: {\n const payload = readPayloadRecord(event);\n const executionId =\n typeof payload?.executionId === \"string\" ? payload.executionId : `exec-${event.offset}`;\n const live = ensureLive(state, event.offset, timestampMs);\n const step: AgentUiCodeStep = {\n kind: \"code\",\n id: `code-${executionId}`,\n executionId,\n status: \"running\",\n code: typeof payload?.code === \"string\" ? payload.code : \"\",\n startedAtMs: timestampMs,\n };\n return { ...state, live: { ...live, steps: [...live.steps, step] } };\n }\n\n case SCRIPT_EXECUTION_COMPLETED:\n case CODEMODE_SCRIPT_EXECUTION_COMPLETED: {\n const payload = readPayloadRecord(event);\n if (payload == null || state.live == null) return state;\n const executionId = typeof payload.executionId === \"string\" ? payload.executionId : null;\n const outcome = readCodeOutcome(payload);\n const steps = [...state.live.steps];\n const index =\n executionId == null\n ? steps.findLastIndex((step) => step.kind === \"code\" && step.status === \"running\")\n : steps.findIndex((step) => step.kind === \"code\" && step.executionId === executionId);\n const step = steps[index];\n if (step == null || step.kind !== \"code\") return state;\n steps[index] = { ...step, status: \"done\", ...outcome };\n return { ...state, live: { ...state.live, steps } };\n }\n\n case AGENT_STATUS_UPDATED: {\n if (readString(event, \"status\") !== \"idle\") return state;\n // Idle does NOT settle: rounds within one conversation roll into a\n // single activity, and only chat messages break it up. Mark the live\n // activity waiting so the UI can park the spinner until the next round.\n if (state.live == null) return state;\n return { ...state, live: { ...state.live, status: \"waiting\" } };\n }\n\n case STREAM_SUBSCRIBER_CONNECTED: {\n const payload = readPayloadRecord(event);\n if (payload == null) return state;\n const subscriptionKey =\n typeof payload.subscriptionKey === \"string\" ? payload.subscriptionKey : null;\n if (subscriptionKey == null) return state;\n const direction = payload.direction === \"inbound\" ? \"inbound\" : \"outbound\";\n const subscriber = isRecord(payload.subscriber) ? payload.subscriber : undefined;\n const announcement = readProcessorAnnouncement(subscriber?.processor);\n const entry: AgentUiPresenceEntry = {\n subscriptionKey,\n direction,\n connected: true,\n ...(typeof subscriber?.description === \"string\"\n ? { description: subscriber.description }\n : {}),\n ...(announcement == null ? {} : { processor: announcement }),\n };\n const existingIndex = state.presence.findIndex(\n (candidate) => candidate.subscriptionKey === subscriptionKey,\n );\n const presence =\n existingIndex === -1\n ? [...state.presence, entry]\n : state.presence.map((candidate, index) =>\n index === existingIndex ? { ...candidate, ...entry } : candidate,\n );\n return { ...state, presence };\n }\n\n case STREAM_SUBSCRIBER_DISCONNECTED: {\n const subscriptionKey = readString(event, \"subscriptionKey\");\n if (subscriptionKey == null) return state;\n return {\n ...state,\n presence: state.presence.map((entry) =>\n entry.subscriptionKey === subscriptionKey ? { ...entry, connected: false } : entry,\n ),\n };\n }\n\n case STREAM_WOKEN: {\n // Every connection died with the previous stream incarnation; survivors\n // re-dial and re-land as fresh connected facts.\n return {\n ...state,\n presence: state.presence.map((entry) =>\n entry.connected ? { ...entry, connected: false } : entry,\n ),\n };\n }\n\n default:\n return state;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Reducer helpers\n// ---------------------------------------------------------------------------\n\nfunction ensureLive(state: AgentUiState, offset: number, startedAtMs: number): AgentUiActivity {\n // A new step resumes a waiting activity — that's the roll-up.\n if (state.live != null) return { ...state.live, status: \"running\" };\n return {\n kind: \"activity\",\n id: `activity-${offset}`,\n status: \"running\",\n steps: [],\n startedAtMs,\n };\n}\n\n/** Closes the live activity (if any) and emits it as a settled item. */\nfunction settleLive(state: AgentUiState, endedAtMs: number, ops: AgentUiOp[]): AgentUiState {\n if (state.live == null) return state;\n if (state.live.steps.length === 0) return { ...state, live: null };\n const settled: AgentUiActivity = {\n ...state.live,\n status: \"done\",\n endedAtMs,\n steps: state.live.steps.map((step) =>\n step.status === \"running\" ? ({ ...step, status: \"done\" } as AgentUiStep) : step,\n ),\n };\n return emitItem({ ...state, live: null }, ops, settled);\n}\n\nfunction flushQueuedUserMessages(state: AgentUiState, ops: AgentUiOp[]): AgentUiState {\n let next: AgentUiState = { ...state, queuedUserMessages: [] };\n for (const item of state.queuedUserMessages) {\n next = emitItem(next, ops, item);\n }\n return next;\n}\n\nfunction updateLlmStep(\n state: AgentUiState,\n llmRequestId: number,\n update: (step: AgentUiLlmStep) => AgentUiLlmStep,\n): AgentUiState {\n if (state.live == null) return state;\n const index = state.live.steps.findIndex(\n (step) => step.kind === \"llm\" && step.llmRequestId === llmRequestId,\n );\n const step = state.live.steps[index];\n if (step == null || step.kind !== \"llm\") return state;\n const steps = [...state.live.steps];\n steps[index] = update(step);\n return { ...state, live: { ...state.live, steps } };\n}\n\nfunction extractCloudflareChunkDeltas(chunk: unknown): {\n responseDelta: string;\n thinkingDelta: string;\n} {\n if (typeof chunk === \"string\") return { responseDelta: chunk, thinkingDelta: \"\" };\n if (!isRecord(chunk)) return { responseDelta: \"\", thinkingDelta: \"\" };\n\n // Workers AI: { response: \"tok\" }\n if (typeof chunk.response === \"string\") {\n return { responseDelta: chunk.response, thinkingDelta: \"\" };\n }\n // OpenAI-compatible chat completions: { choices: [{ delta: { content, reasoning_content } }] }\n if (Array.isArray(chunk.choices) && isRecord(chunk.choices[0])) {\n const delta = isRecord(chunk.choices[0].delta) ? chunk.choices[0].delta : undefined;\n return {\n responseDelta: typeof delta?.content === \"string\" ? delta.content : \"\",\n thinkingDelta: typeof delta?.reasoning_content === \"string\" ? delta.reasoning_content : \"\",\n };\n }\n // Anthropic: { delta: { text, thinking } }\n if (isRecord(chunk.delta)) {\n return {\n responseDelta: typeof chunk.delta.text === \"string\" ? chunk.delta.text : \"\",\n thinkingDelta: typeof chunk.delta.thinking === \"string\" ? chunk.delta.thinking : \"\",\n };\n }\n return { responseDelta: \"\", thinkingDelta: \"\" };\n}\n\nfunction readCodeOutcome(payload: Record<string, unknown>): Partial<AgentUiCodeStep> {\n const outcome = isRecord(payload.outcome) ? payload.outcome : undefined;\n const success = payload.ok !== false && payload.error == null && outcome?.status !== \"threw\";\n const result = \"result\" in payload ? payload.result : outcome?.value;\n const error =\n typeof payload.error === \"string\"\n ? payload.error\n : outcome?.status === \"threw\"\n ? stringifyUnknown(outcome.error)\n : undefined;\n const logs = Array.isArray(payload.logs)\n ? payload.logs.filter((line): line is string => typeof line === \"string\")\n : undefined;\n return {\n success,\n ...(result === undefined ? {} : { result }),\n ...(error == null ? {} : { errorMessage: error }),\n ...(logs == null ? {} : { logs }),\n ...(typeof payload.durationMs === \"number\" ? { durationMs: payload.durationMs } : {}),\n };\n}\n\nfunction readUsageTokens(usage: unknown): { input?: number; output?: number } {\n if (!isRecord(usage)) return {};\n const input = usage.input_tokens ?? usage.prompt_tokens;\n const output = usage.output_tokens ?? usage.completion_tokens;\n return {\n ...(typeof input === \"number\" ? { input } : {}),\n ...(typeof output === \"number\" ? { output } : {}),\n };\n}\n\nfunction readProcessorAnnouncement(value: unknown): AgentUiProcessorAnnouncement | null {\n if (!isRecord(value)) return null;\n const announcement = isRecord(value.announcement) ? value.announcement : value;\n if (typeof announcement.slug !== \"string\" || typeof announcement.version !== \"string\")\n return null;\n return {\n slug: announcement.slug,\n version: announcement.version,\n description: typeof announcement.description === \"string\" ? announcement.description : \"\",\n consumes: readStringArray(announcement.consumes),\n emits: readStringArray(announcement.emits),\n ownedEvents: Array.isArray(announcement.ownedEvents)\n ? announcement.ownedEvents\n .filter((owned): owned is Record<string, unknown> => isRecord(owned))\n .filter((owned) => typeof owned.type === \"string\")\n .map((owned) => ({\n type: owned.type as string,\n ...(typeof owned.description === \"string\" ? { description: owned.description } : {}),\n }))\n : [],\n };\n}\n\nfunction readStringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === \"string\")\n : [];\n}\n\nfunction readString(event: Event, key: string): string | null {\n const value = readPayloadRecord(event)?.[key];\n return typeof value === \"string\" ? value : null;\n}\n\nfunction readNumber(event: Event, key: string): number | null {\n const value = readPayloadRecord(event)?.[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction readRecord(event: Event, key: string): Record<string, unknown> | null {\n const value = readPayloadRecord(event)?.[key];\n return isRecord(value) ? value : null;\n}\n\nfunction readPayloadRecord(event: Event): Record<string, unknown> | null {\n return isRecord(event.payload) ? event.payload : null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction stringifyUnknown(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n","/**\n * In-memory agent conversation feed for the chat TUI.\n *\n * This is the node-side sibling of the browser mirror's agent-ui processor\n * (apps/os/src/domains/streams/client-libraries/processors/agent-ui-processor.ts):\n * both fold the SAME shared reducer (`planAgentUiOps` from @iterate-com/ui)\n * over agent stream events. The browser persists settled items into SQLite for\n * a virtual list; a terminal session is ephemeral and small, so this model\n * keeps the settled items in a plain array and the streaming live activity in\n * the reduced state — no database, no processor host.\n */\nimport {\n initialAgentUiState,\n planAgentUiOps,\n type AgentUiItem,\n type AgentUiState,\n} from \"@iterate-com/ui/components/events/agent-ui-reducer\";\nimport type { StreamEvent } from \"../../../../apps/os/src/types.ts\";\n\nexport type AgentFeedSnapshot = {\n /** Settled conversation items in list order (user, assistant, activity). */\n items: readonly AgentUiItem[];\n /** The in-flight activity with streaming thinking/response text, if any. */\n live: AgentUiState[\"live\"];\n eventCount: number;\n /** Highest stream offset folded in — the resume cursor for re-subscribes. */\n lastOffset: number;\n};\n\ntype AgentFeedModel = {\n snapshot(): AgentFeedSnapshot;\n /**\n * Fold a batch of stream events. Events at or below `lastOffset` are\n * ignored, so replay overlap after a reconnect is harmless. Returns true\n * when the snapshot changed.\n */\n applyEvents(events: readonly StreamEvent[]): boolean;\n};\n\ntype ReducerEvents = Parameters<typeof planAgentUiOps>[1];\n\nexport function createAgentFeedModel(): AgentFeedModel {\n let state = initialAgentUiState();\n let items: AgentUiItem[] = [];\n let lastOffset = 0;\n let snapshot: AgentFeedSnapshot = { items, live: null, eventCount: 0, lastOffset };\n\n return {\n snapshot: () => snapshot,\n applyEvents(events) {\n const fresh = events.filter((event) => event.offset > lastOffset);\n if (fresh.length === 0) return false;\n\n lastOffset = fresh[fresh.length - 1]!.offset;\n const { endState, ops } = planAgentUiOps(state, fresh as unknown as ReducerEvents);\n if (ops.length > 0) {\n items = [...items];\n for (const op of ops) items[op.localIndex] = op.item;\n }\n state = endState;\n snapshot = { items, live: state.live, eventCount: state.eventCount, lastOffset };\n return true;\n },\n };\n}\n","/**\n * The chat TUI's connection to one project agent over the shared itx client\n * (apps/os/src/itx-client.ts): a capnweb WebSocket carrying the same `Agent`\n * capability the web app and CLI use. One live subscription pumps stream\n * events into the caller; sends go through `agent.sendMessage`. On a broken\n * session the connection re-dials and re-subscribes from the caller's resume\n * cursor (feed folds are offset-deduped, so replay overlap is harmless).\n */\nimport type { RpcStub } from \"capnweb\";\nimport { connectItx } from \"../../../../apps/os/src/itx-client.ts\";\nimport type { Agent, ItxAuthCredentials, StreamEvent } from \"../../../../apps/os/src/types.ts\";\nimport { readConfig } from \"../config.ts\";\n\nconst RECONNECT_DELAY_MS = 1_000;\nconst MAX_RECONNECT_DELAY_MS = 15_000;\n\nexport type AgentConnectionStatus =\n | { kind: \"connecting\" }\n | { kind: \"live\" }\n | { kind: \"reconnecting\"; detail: string };\n\n/**\n * Resolve itx credentials for the TUI, in priority order: an admin API secret\n * from the environment (doppler / e2e lanes), an explicit bearer token, then\n * the stored `iterate login` session for the named config. The launcher\n * (`iterate chat`) refreshes the stored session before spawning the TUI, so a\n * plain bearer read is enough here.\n */\nexport function resolveItxAuth(input: { configName: string | undefined }): ItxAuthCredentials {\n const adminSecret = readEnv(\"APP_CONFIG_ADMIN_API_SECRET\");\n if (adminSecret) return { type: \"admin-secret\", secret: adminSecret };\n\n const bearerToken = readEnv(\"ITERATE_BEARER_TOKEN\");\n if (bearerToken) return { type: \"bearer\", token: bearerToken };\n\n if (input.configName) {\n const config = readConfig(input.configName, { throw: true });\n if (config.session?.token) return { type: \"bearer\", token: config.session.token };\n }\n\n throw new Error(\n \"No credentials: run `iterate login`, or set an admin API secret \" +\n \"(APP_CONFIG_ADMIN_API_SECRET) or a bearer token (ITERATE_BEARER_TOKEN).\",\n );\n}\n\ntype AgentConnection = {\n /** Append one user message to the agent stream (triggers the agent loop). */\n sendMessage(text: string): Promise<void>;\n dispose(): void;\n};\n\nexport function connectAgentFeed(input: {\n auth: ItxAuthCredentials;\n baseUrl: string;\n projectId: string;\n agentPath: string;\n /** Resume cursor for (re)subscribes — typically the feed model's lastOffset. */\n replayAfterOffset: () => number;\n onEvents: (events: readonly StreamEvent[]) => void;\n onStatus: (status: AgentConnectionStatus) => void;\n}): AgentConnection {\n let disposed = false;\n let agent: RpcStub<Agent> | undefined;\n let subscription: Disposable | undefined;\n let consecutiveFailures = 0;\n\n const disposeAgent = () => {\n try {\n subscription?.[Symbol.dispose]?.();\n agent?.[Symbol.dispose]?.();\n } catch {\n // The socket may already be gone; the stub is dead either way.\n }\n subscription = undefined;\n agent = undefined;\n };\n\n const scheduleReconnect = (detail: string) => {\n if (disposed) return;\n disposeAgent();\n consecutiveFailures += 1;\n const delay = Math.min(RECONNECT_DELAY_MS * consecutiveFailures, MAX_RECONNECT_DELAY_MS);\n input.onStatus({ kind: \"reconnecting\", detail });\n setTimeout(() => void establish(), delay);\n };\n\n async function establish(): Promise<void> {\n if (disposed) return;\n input.onStatus({ kind: \"connecting\" });\n const nextAgent = connectItx({\n auth: input.auth,\n baseUrl: input.baseUrl,\n projectId: input.projectId,\n agentPath: input.agentPath,\n });\n agent = nextAgent;\n // Best-effort transport-death signal; a failed subscribe below covers the rest.\n (nextAgent as { onRpcBroken?: (cb: (error: unknown) => void) => void }).onRpcBroken?.(\n (error) => {\n if (agent !== nextAgent) return;\n scheduleReconnect(errorMessage(error));\n },\n );\n try {\n subscription = await nextAgent.stream.subscribe({\n processEventBatch: (batch) => input.onEvents(batch.events),\n replayAfterOffset: input.replayAfterOffset(),\n subscriber: { description: \"iterate chat TUI\" },\n });\n if (disposed) {\n disposeAgent();\n return;\n }\n consecutiveFailures = 0;\n input.onStatus({ kind: \"live\" });\n } catch (error) {\n if (agent === nextAgent) scheduleReconnect(errorMessage(error));\n }\n }\n\n void establish();\n\n return {\n async sendMessage(text) {\n if (agent === undefined) throw new Error(\"not connected\");\n await agent.sendMessage(text);\n },\n dispose() {\n disposed = true;\n disposeAgent();\n },\n };\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction readEnv(name: string): string | undefined {\n const value = process.env[name]?.trim();\n return value ? value : undefined;\n}\n","/**\n * Pure terminal formatting for agent feed items. Phrasing deliberately rhymes\n * with the web feed (apps/os/src/components/agent-feed.tsx): activities read\n * \"Ran code 2× · 3 requests · 7.4s\", steps read \"gpt-5 · 1.2s\".\n */\nimport type {\n AgentUiActivity,\n AgentUiStep,\n} from \"@iterate-com/ui/components/events/agent-ui-reducer\";\n\nexport function formatActivitySummary(activity: AgentUiActivity): string {\n const codeCount = activity.steps.filter((step) => step.kind === \"code\").length;\n const requestCount = activity.steps.filter((step) => step.kind === \"llm\").length;\n const interrupted = activity.steps.some(\n (step) => step.kind === \"llm\" && step.outcome === \"cancelled\",\n );\n const parts: string[] = [];\n if (codeCount > 0) parts.push(`Ran code ${codeCount}×`);\n parts.push(`${requestCount} request${requestCount === 1 ? \"\" : \"s\"}`);\n if (interrupted) parts.push(\"interrupted\");\n const totalMs =\n activity.endedAtMs == null ? null : Math.max(0, activity.endedAtMs - activity.startedAtMs);\n if (totalMs != null && totalMs > 0) parts.push(formatSeconds(totalMs));\n return parts.join(\" · \");\n}\n\nexport function formatStepLine(step: AgentUiStep): string {\n const label = step.kind === \"code\" ? \"Ran code\" : (step.model ?? step.provider ?? \"LLM request\");\n const parts: string[] = [label];\n if (step.kind === \"llm\") {\n if (step.inputTokens != null || step.outputTokens != null) {\n parts.push(`${formatTokens(step.inputTokens)} → ${formatTokens(step.outputTokens)} tok`);\n }\n if (step.outcome === \"failed\") parts.push(\"failed\");\n if (step.outcome === \"cancelled\") parts.push(\"interrupted\");\n } else if (step.success === false) {\n parts.push(\"failed\");\n }\n if (step.durationMs != null) parts.push(formatSeconds(step.durationMs));\n if (step.status === \"running\") parts.push(\"running\");\n return parts.join(\" · \");\n}\n\nfunction formatSeconds(ms: number): string {\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction formatTokens(count: number | undefined): string {\n if (count == null) return \"?\";\n if (count < 1000) return String(count);\n return `${(count / 1000).toFixed(1)}k`;\n}\n\n/** The last `maxChars` of streamed text, trimmed to whole lines where possible. */\nexport function streamingTail(text: string, maxChars = 600): string {\n const trimmed = text.trimEnd();\n if (trimmed.length <= maxChars) return trimmed;\n const tail = trimmed.slice(-maxChars);\n const firstNewline = tail.indexOf(\"\\n\");\n return `…${firstNewline === -1 ? tail : tail.slice(firstNewline)}`;\n}\n","#!/usr/bin/env bun\n/** @jsxImportSource @opentui/react */\n// oxlint-disable react/only-export-components -- CLI entrypoint, not a Vite Fast Refresh module.\n/**\n * React/OpenTUI terminal chat with one project agent.\n *\n * The data layer is the shared client stack, not a bespoke stream client:\n * `connectItx` (apps/os/src/itx-client.ts) hands us the same `Agent`\n * capability the web app uses, a live `stream.subscribe` pumps events into\n * the shared agent-ui reducer (@iterate-com/ui), and sends go through\n * `agent.sendMessage`. This file owns only terminal runtime state and\n * rendering.\n */\nimport { StyledText, bg, fg } from \"@opentui/core\";\nimport { createCliRenderer } from \"@opentui/core\";\nimport { createRoot, useKeyboard } from \"@opentui/react\";\nimport { useCallback, useState, useSyncExternalStore } from \"react\";\nimport type {\n AgentUiActivity,\n AgentUiItem,\n AgentUiMessageItem,\n} from \"@iterate-com/ui/components/events/agent-ui-reducer\";\nimport { createAgentFeedModel, type AgentFeedSnapshot } from \"./agent-feed-model.ts\";\nimport {\n connectAgentFeed,\n resolveItxAuth,\n type AgentConnectionStatus,\n} from \"./agent-connection.ts\";\nimport { formatActivitySummary, formatStepLine, streamingTail } from \"./feed-format.ts\";\n\nif (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new Error(\"iterate chat requires an interactive terminal.\");\n}\n\nconst COLORS = {\n bg: \"#0b0f14\",\n surface: \"#27272a\",\n border: \"#3f3f46\",\n accent: \"#22c55e\",\n warning: \"#facc15\",\n danger: \"#ef4444\",\n text: \"#e5e7eb\",\n textSecondary: \"#9ca3af\",\n textBody: \"#d1d5db\",\n textMuted: \"#6b7280\",\n agent: \"#a78bfa\",\n} as const;\n\nconst args = parseArgs(process.argv.slice(2));\n\n// ---------------------------------------------------------------------------\n// App state: one feed model + one connection, exposed to React through a tiny\n// external store (the connection callbacks fire outside React).\n// ---------------------------------------------------------------------------\n\ntype AppState = {\n feed: AgentFeedSnapshot;\n status: AgentConnectionStatus;\n notice: string;\n};\n\nconst model = createAgentFeedModel();\nlet appState: AppState = {\n feed: model.snapshot(),\n status: { kind: \"connecting\" },\n notice: \"\",\n};\nconst listeners = new Set<() => void>();\n\nfunction patchAppState(patch: Partial<AppState>) {\n appState = { ...appState, ...patch };\n for (const listener of listeners) listener();\n}\n\nconst connection = connectAgentFeed({\n auth: resolveItxAuth({ configName: process.env.ITERATE_CONFIG_NAME }),\n baseUrl: args.baseUrl,\n projectId: args.projectId,\n agentPath: args.agentPath,\n replayAfterOffset: () => model.snapshot().lastOffset,\n onEvents: (events) => {\n if (model.applyEvents(events)) patchAppState({ feed: model.snapshot() });\n },\n onStatus: (status) => patchAppState({ status }),\n});\n\n// ---------------------------------------------------------------------------\n// Rendering\n// ---------------------------------------------------------------------------\n\nfunction AgentChatApp() {\n const state = useSyncExternalStore(\n useCallback((listener: () => void) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n }, []),\n () => appState,\n );\n const [composerValue, setComposerValue] = useState(\"\");\n const [composerRevision, setComposerRevision] = useState(0);\n\n const clearComposer = useCallback(() => {\n setComposerValue(\"\");\n setComposerRevision((previous) => previous + 1);\n }, []);\n\n useKeyboard((key) => {\n if (key.name === \"escape\") clearComposer();\n });\n\n const submit = useCallback(\n (value: string) => {\n const message = value.trim();\n if (message === \"\") return;\n clearComposer();\n patchAppState({ notice: \"sending…\" });\n connection\n .sendMessage(message)\n .then(() => patchAppState({ notice: \"\" }))\n .catch((error: unknown) => {\n patchAppState({\n notice: `send failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n });\n },\n [clearComposer],\n );\n\n return (\n <box width=\"100%\" height=\"100%\" flexDirection=\"column\" backgroundColor={COLORS.bg}>\n <ChatHeader status={state.status} notice={state.notice} eventCount={state.feed.eventCount} />\n <scrollbox\n width=\"100%\"\n flexGrow={1}\n border\n borderStyle=\"single\"\n borderColor={COLORS.border}\n backgroundColor={COLORS.bg}\n stickyScroll\n stickyStart=\"bottom\"\n contentOptions={{ flexDirection: \"column\", paddingLeft: 1, paddingRight: 1, gap: 1 }}\n >\n {state.feed.items.length === 0 && state.feed.live == null ? (\n <text fg={COLORS.textMuted}>\n No messages yet — say something to {args.agentPath.slice(\"/agents/\".length)}.\n </text>\n ) : null}\n {state.feed.items.map((item) => (\n <FeedItem key={item.id} item={item} />\n ))}\n {state.feed.live == null ? null : <LiveActivity activity={state.feed.live} />}\n </scrollbox>\n <box\n width=\"100%\"\n height={3}\n border\n borderStyle=\"single\"\n borderColor={COLORS.accent}\n backgroundColor={COLORS.bg}\n paddingLeft={1}\n paddingRight={1}\n >\n <input\n key={composerRevision}\n width=\"100%\"\n value={composerValue}\n placeholder=\"Message the agent (Enter to send, Ctrl+C to quit)\"\n focused\n backgroundColor=\"transparent\"\n focusedBackgroundColor=\"transparent\"\n textColor={COLORS.text}\n focusedTextColor={COLORS.text}\n placeholderColor={COLORS.textMuted}\n cursorColor={COLORS.accent}\n onInput={setComposerValue}\n onSubmit={(value) => {\n if (typeof value === \"string\") submit(value);\n }}\n />\n </box>\n </box>\n );\n}\n\nfunction ChatHeader(props: { status: AgentConnectionStatus; notice: string; eventCount: number }) {\n const statusLabel =\n props.status.kind === \"live\"\n ? \"live\"\n : props.status.kind === \"connecting\"\n ? \"connecting\"\n : `reconnecting (${props.status.detail})`;\n const statusColor =\n props.status.kind === \"live\"\n ? COLORS.accent\n : props.status.kind === \"connecting\"\n ? COLORS.warning\n : COLORS.danger;\n const meta = [\n `${props.eventCount} event${props.eventCount === 1 ? \"\" : \"s\"}`,\n statusLabel,\n props.notice,\n ]\n .filter(Boolean)\n .join(\" · \");\n\n return (\n <box\n width=\"100%\"\n height={3}\n border\n borderStyle=\"single\"\n borderColor={COLORS.border}\n backgroundColor={COLORS.surface}\n flexDirection=\"row\"\n paddingLeft={1}\n paddingRight={1}\n gap={1}\n >\n <text width={6} content={getBrandMarkText()} />\n <text flexGrow={1} fg={COLORS.text} content={`${args.projectId} ${args.agentPath}`} />\n <text fg={COLORS.textSecondary} content={meta} />\n <text width={2} fg={statusColor}>\n ●\n </text>\n </box>\n );\n}\n\nfunction FeedItem(props: { item: AgentUiItem }) {\n if (props.item.kind === \"activity\") return <SettledActivity activity={props.item} />;\n return <Message item={props.item} />;\n}\n\nfunction Message(props: { item: AgentUiMessageItem }) {\n const isUser = props.item.kind === \"user\";\n return (\n <box flexDirection=\"column\">\n <text fg={isUser ? COLORS.accent : COLORS.agent}>\n {isUser ? \"you ›\" : \"agent ›\"}\n <span fg={COLORS.textMuted}> {formatClock(props.item.timestampMs)}</span>\n </text>\n <text fg={COLORS.textBody}>{props.item.text}</text>\n </box>\n );\n}\n\nfunction SettledActivity(props: { activity: AgentUiActivity }) {\n return (\n <box flexDirection=\"column\">\n <text fg={COLORS.textMuted}>✦ {formatActivitySummary(props.activity)}</text>\n {props.activity.steps.map((step) => (\n <text key={step.id} fg={COLORS.textMuted}>\n {\" \"}· {formatStepLine(step)}\n </text>\n ))}\n </box>\n );\n}\n\nfunction LiveActivity(props: { activity: AgentUiActivity }) {\n const lastStep = props.activity.steps[props.activity.steps.length - 1];\n const thinking = lastStep?.kind === \"llm\" ? streamingTail(lastStep.thinkingText) : \"\";\n const streamed =\n lastStep?.kind === \"llm\"\n ? streamingTail(lastStep.responseText)\n : lastStep?.kind === \"code\"\n ? streamingTail(lastStep.code)\n : \"\";\n return (\n <box flexDirection=\"column\">\n <text fg={props.activity.status === \"waiting\" ? COLORS.textMuted : COLORS.warning}>\n ✦ {props.activity.status === \"waiting\" ? \"waiting\" : \"working…\"}\n </text>\n {props.activity.steps.map((step) => (\n <text key={step.id} fg={COLORS.textMuted}>\n {\" \"}· {formatStepLine(step)}\n </text>\n ))}\n {thinking === \"\" ? null : <text fg={COLORS.textMuted}>{thinking}</text>}\n {streamed === \"\" ? null : <text fg={COLORS.textSecondary}>{streamed}</text>}\n </box>\n );\n}\n\nfunction getBrandMarkText() {\n return new StyledText([\n fg(\"#000000\")(bg(COLORS.surface)(\"▐\")),\n bg(\"#000000\")(fg(\"#ffffff\")(\" 𝑖 \")),\n fg(\"#000000\")(bg(COLORS.surface)(\"▌\")),\n ]);\n}\n\nfunction formatClock(timestampMs: number) {\n return new Date(timestampMs).toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\nfunction parseArgs(argv: string[]) {\n const baseUrl = readFlag(argv, \"--base-url\");\n const projectId = readFlag(argv, \"--project-id\");\n const agentPath = readFlag(argv, \"--agent-path\");\n\n if (baseUrl == null || projectId == null || agentPath == null) {\n throw new Error(\n \"Usage: bun agent-chat-terminal.tsx --base-url <url> --project-id <prj_id> --agent-path </agents/name>\",\n );\n }\n if (!agentPath.startsWith(\"/agents/\")) {\n throw new Error(`--agent-path must start with \"/agents/\", got \"${agentPath}\".`);\n }\n\n return {\n baseUrl: baseUrl.replace(/\\/+$/, \"\"),\n projectId,\n agentPath,\n };\n}\n\nfunction readFlag(argv: string[], flagName: string) {\n const index = argv.indexOf(flagName);\n if (index === -1) return undefined;\n const value = argv[index + 1];\n if (value == null || value.startsWith(\"--\")) {\n throw new Error(`${flagName} requires a value.`);\n }\n return value;\n}\n\nconst renderer = await createCliRenderer({\n exitOnCtrlC: true,\n targetFps: 30,\n screenMode: \"alternate-screen\",\n consoleMode: \"disabled\",\n});\nprocess.on(\"exit\", () => connection.dispose());\ncreateRoot(renderer).render(<AgentChatApp />);\n"],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { WorkerEntrypoint } from "cloudflare:workers";
|
|
2
|
+
|
|
3
|
+
export type IterateStreamAppendInput = {
|
|
4
|
+
event: unknown;
|
|
5
|
+
streamPath?: string;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export type IterateProjectStreams = {
|
|
9
|
+
append(input: IterateStreamAppendInput): Promise<unknown>;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export type IterateProjectItx<Context = unknown> = {
|
|
13
|
+
context: Promise<Context>;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type IterateProjectEnv<Context = unknown> = {
|
|
17
|
+
ITERATE: IterateProjectItx<Context>;
|
|
18
|
+
STREAMS: IterateProjectStreams;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export type IterateProjectEventInput = {
|
|
22
|
+
event: unknown;
|
|
23
|
+
streamPath: string;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export declare class IterateProjectEntrypoint<Context = unknown> extends WorkerEntrypoint<
|
|
27
|
+
IterateProjectEnv<Context>
|
|
28
|
+
> {
|
|
29
|
+
get itx(): IterateProjectItx<Context>;
|
|
30
|
+
get streams(): IterateProjectStreams;
|
|
31
|
+
processEvent(input: IterateProjectEventInput): Promise<void>;
|
|
32
|
+
protected onProjectEvent(input: IterateProjectEventInput): Promise<void>;
|
|
33
|
+
}
|
package/dist/worker.mjs
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { WorkerEntrypoint } from "cloudflare:workers";
|
|
2
|
+
//#region src/worker.ts
|
|
3
|
+
var IterateProjectEntrypoint = class extends WorkerEntrypoint {
|
|
4
|
+
get itx() {
|
|
5
|
+
return this.env.ITERATE;
|
|
6
|
+
}
|
|
7
|
+
get streams() {
|
|
8
|
+
return this.env.STREAMS;
|
|
9
|
+
}
|
|
10
|
+
async processEvent(input) {
|
|
11
|
+
await this.onProjectEvent(input);
|
|
12
|
+
}
|
|
13
|
+
async onProjectEvent(_input) {}
|
|
14
|
+
};
|
|
15
|
+
//#endregion
|
|
16
|
+
export { IterateProjectEntrypoint };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=worker.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.mjs","names":[],"sources":["../src/worker.ts"],"sourcesContent":["import { WorkerEntrypoint } from \"cloudflare:workers\";\n\nexport type IterateStreamAppendInput = {\n event: unknown;\n streamPath?: string;\n};\n\nexport type IterateProjectStreams = {\n append: (input: IterateStreamAppendInput) => Promise<unknown>;\n};\n\nexport type IterateProjectItx<Context = unknown> = {\n context: Promise<Context>;\n};\n\nexport type IterateProjectEnv<Context = unknown> = {\n ITERATE: IterateProjectItx<Context>;\n STREAMS: IterateProjectStreams;\n};\n\nexport type IterateProjectEventInput = {\n event: unknown;\n streamPath: string;\n};\n\nexport class IterateProjectEntrypoint<Context = unknown> extends WorkerEntrypoint<\n IterateProjectEnv<Context>\n> {\n get itx(): IterateProjectItx<Context> {\n return this.env.ITERATE;\n }\n\n get streams(): IterateProjectEnv[\"STREAMS\"] {\n return this.env.STREAMS;\n }\n\n async processEvent(input: IterateProjectEventInput): Promise<void> {\n await this.onProjectEvent(input);\n }\n\n protected async onProjectEvent(_input: IterateProjectEventInput): Promise<void> {}\n}\n"],"mappings":";;AAyBA,IAAa,2BAAb,cAAiE,iBAE/D;CACA,IAAI,MAAkC;EACpC,OAAO,KAAK,IAAI;CAClB;CAEA,IAAI,UAAwC;EAC1C,OAAO,KAAK,IAAI;CAClB;CAEA,MAAM,aAAa,OAAgD;EACjE,MAAM,KAAK,eAAe,KAAK;CACjC;CAEA,MAAgB,eAAe,QAAiD,CAAC;AACnF"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iterate",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.6",
|
|
4
4
|
"description": "CLI for iterate",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/iterate/iterate
|
|
9
|
+
"url": "git+https://github.com/iterate/iterate",
|
|
10
10
|
"directory": "packages/iterate"
|
|
11
11
|
},
|
|
12
12
|
"homepage": "https://github.com/iterate/iterate#readme",
|
|
@@ -16,31 +16,54 @@
|
|
|
16
16
|
"keywords": [
|
|
17
17
|
"iterate",
|
|
18
18
|
"cli",
|
|
19
|
-
"
|
|
19
|
+
"orpc"
|
|
20
20
|
],
|
|
21
21
|
"engines": {
|
|
22
22
|
"node": ">=22"
|
|
23
23
|
},
|
|
24
|
-
"publishConfig": {
|
|
25
|
-
"access": "public"
|
|
26
|
-
},
|
|
27
24
|
"bin": {
|
|
28
25
|
"iterate": "./bin/iterate.js"
|
|
29
26
|
},
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"import": "./dist/index.mjs",
|
|
30
|
+
"types": "./dist/index.d.mts"
|
|
31
|
+
},
|
|
32
|
+
"./worker": {
|
|
33
|
+
"import": "./dist/worker.mjs",
|
|
34
|
+
"types": "./dist/worker.d.mts"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public"
|
|
39
|
+
},
|
|
30
40
|
"files": [
|
|
31
41
|
"bin",
|
|
42
|
+
"dist",
|
|
32
43
|
"README.md"
|
|
33
44
|
],
|
|
34
|
-
"scripts": {
|
|
35
|
-
"typecheck": "node --check ./bin/iterate.js"
|
|
36
|
-
},
|
|
37
45
|
"dependencies": {
|
|
38
46
|
"@clack/prompts": "^1.0.0",
|
|
39
|
-
"@
|
|
40
|
-
"@
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
47
|
+
"@opentui/core": "0.1.102",
|
|
48
|
+
"@opentui/react": "0.1.102",
|
|
49
|
+
"@orpc/client": "1.13.14",
|
|
50
|
+
"@orpc/server": "1.13.14",
|
|
51
|
+
"capnweb": "^0.8.0",
|
|
52
|
+
"react": "^19.2.0",
|
|
53
|
+
"trpc-cli": "0.15.1",
|
|
54
|
+
"ws": "8.19.0",
|
|
44
55
|
"zod": "4.1.12"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/node": "^22.0.0",
|
|
59
|
+
"@types/react": "^19.2.14",
|
|
60
|
+
"tsdown": "0.22.2",
|
|
61
|
+
"vitest": "4.0.15",
|
|
62
|
+
"@iterate-com/ui": "0.0.1"
|
|
63
|
+
},
|
|
64
|
+
"scripts": {
|
|
65
|
+
"build": "tsdown",
|
|
66
|
+
"typecheck": "tsgo --noEmit",
|
|
67
|
+
"test": "vitest run"
|
|
45
68
|
}
|
|
46
|
-
}
|
|
69
|
+
}
|