@loopstack/cli 0.17.0 → 0.19.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 (131) hide show
  1. package/README.md +14 -10
  2. package/dist/commands/answer.d.ts +3 -0
  3. package/dist/commands/answer.d.ts.map +1 -0
  4. package/dist/commands/answer.js +82 -0
  5. package/dist/commands/answer.js.map +1 -0
  6. package/dist/commands/attach.d.ts +3 -0
  7. package/dist/commands/attach.d.ts.map +1 -0
  8. package/dist/commands/attach.js +103 -0
  9. package/dist/commands/attach.js.map +1 -0
  10. package/dist/commands/create.js +3 -3
  11. package/dist/commands/create.js.map +1 -1
  12. package/dist/commands/run.d.ts.map +1 -1
  13. package/dist/commands/run.js +38 -13
  14. package/dist/commands/run.js.map +1 -1
  15. package/dist/commands/runs.d.ts.map +1 -1
  16. package/dist/commands/runs.js +67 -69
  17. package/dist/commands/runs.js.map +1 -1
  18. package/dist/commands/watch.d.ts.map +1 -1
  19. package/dist/commands/watch.js +3 -1
  20. package/dist/commands/watch.js.map +1 -1
  21. package/dist/hitl/discovery.d.ts +15 -7
  22. package/dist/hitl/discovery.d.ts.map +1 -1
  23. package/dist/hitl/discovery.js +85 -28
  24. package/dist/hitl/discovery.js.map +1 -1
  25. package/dist/hitl/idle-handler.d.ts +0 -1
  26. package/dist/hitl/idle-handler.d.ts.map +1 -1
  27. package/dist/hitl/idle-handler.js +49 -17
  28. package/dist/hitl/idle-handler.js.map +1 -1
  29. package/dist/hitl/pending.d.ts +16 -0
  30. package/dist/hitl/pending.d.ts.map +1 -0
  31. package/dist/hitl/pending.js +45 -0
  32. package/dist/hitl/pending.js.map +1 -0
  33. package/dist/hitl/prompt.d.ts +5 -8
  34. package/dist/hitl/prompt.d.ts.map +1 -1
  35. package/dist/hitl/prompt.js +47 -105
  36. package/dist/hitl/prompt.js.map +1 -1
  37. package/dist/main.js +4 -0
  38. package/dist/main.js.map +1 -1
  39. package/dist/output/format.d.ts +1 -1
  40. package/dist/output/format.d.ts.map +1 -1
  41. package/dist/output/format.js +16 -5
  42. package/dist/output/format.js.map +1 -1
  43. package/dist/run/documents.d.ts +13 -1
  44. package/dist/run/documents.d.ts.map +1 -1
  45. package/dist/run/documents.js +82 -22
  46. package/dist/run/documents.js.map +1 -1
  47. package/dist/run/follow.d.ts +6 -2
  48. package/dist/run/follow.d.ts.map +1 -1
  49. package/dist/run/follow.js +61 -9
  50. package/dist/run/follow.js.map +1 -1
  51. package/dist/run/retry.d.ts +5 -0
  52. package/dist/run/retry.d.ts.map +1 -0
  53. package/dist/run/retry.js +59 -0
  54. package/dist/run/retry.js.map +1 -0
  55. package/dist/run/trail.d.ts +17 -0
  56. package/dist/run/trail.d.ts.map +1 -0
  57. package/dist/run/trail.js +42 -0
  58. package/dist/run/trail.js.map +1 -0
  59. package/dist/widgets/collect/form.collect.d.ts +7 -0
  60. package/dist/widgets/collect/form.collect.d.ts.map +1 -0
  61. package/dist/widgets/collect/form.collect.js +71 -0
  62. package/dist/widgets/collect/form.collect.js.map +1 -0
  63. package/dist/widgets/collect/prompts.collect.d.ts +5 -0
  64. package/dist/widgets/collect/prompts.collect.d.ts.map +1 -0
  65. package/dist/widgets/collect/prompts.collect.js +38 -0
  66. package/dist/widgets/collect/prompts.collect.js.map +1 -0
  67. package/dist/widgets/collect/secret-input.collect.d.ts +3 -0
  68. package/dist/widgets/collect/secret-input.collect.d.ts.map +1 -0
  69. package/dist/widgets/collect/secret-input.collect.js +47 -0
  70. package/dist/widgets/collect/secret-input.collect.js.map +1 -0
  71. package/dist/widgets/collect/transition.d.ts +3 -0
  72. package/dist/widgets/collect/transition.d.ts.map +1 -0
  73. package/dist/widgets/collect/transition.js +5 -0
  74. package/dist/widgets/collect/transition.js.map +1 -0
  75. package/dist/widgets/collect/workflow.collect.d.ts +4 -0
  76. package/dist/widgets/collect/workflow.collect.d.ts.map +1 -0
  77. package/dist/widgets/collect/workflow.collect.js +24 -0
  78. package/dist/widgets/collect/workflow.collect.js.map +1 -0
  79. package/dist/widgets/document/form.widget.d.ts +3 -0
  80. package/dist/widgets/document/form.widget.d.ts.map +1 -0
  81. package/dist/widgets/document/form.widget.js +34 -0
  82. package/dist/widgets/document/form.widget.js.map +1 -0
  83. package/dist/widgets/document/json.widget.d.ts +3 -0
  84. package/dist/widgets/document/json.widget.d.ts.map +1 -0
  85. package/dist/widgets/document/json.widget.js +17 -0
  86. package/dist/widgets/document/json.widget.js.map +1 -0
  87. package/dist/widgets/document/link.widget.d.ts +3 -0
  88. package/dist/widgets/document/link.widget.d.ts.map +1 -0
  89. package/dist/widgets/document/link.widget.js +9 -0
  90. package/dist/widgets/document/link.widget.js.map +1 -0
  91. package/dist/widgets/document/llm-message.widget.d.ts +3 -0
  92. package/dist/widgets/document/llm-message.widget.d.ts.map +1 -0
  93. package/dist/widgets/document/llm-message.widget.js +97 -0
  94. package/dist/widgets/document/llm-message.widget.js.map +1 -0
  95. package/dist/widgets/document/message.widget.d.ts +5 -0
  96. package/dist/widgets/document/message.widget.d.ts.map +1 -0
  97. package/dist/widgets/document/message.widget.js +35 -0
  98. package/dist/widgets/document/message.widget.js.map +1 -0
  99. package/dist/widgets/document/oauth-prompt.widget.d.ts +4 -0
  100. package/dist/widgets/document/oauth-prompt.widget.d.ts.map +1 -0
  101. package/dist/widgets/document/oauth-prompt.widget.js +22 -0
  102. package/dist/widgets/document/oauth-prompt.widget.js.map +1 -0
  103. package/dist/widgets/document/secret-request.widget.d.ts +3 -0
  104. package/dist/widgets/document/secret-request.widget.d.ts.map +1 -0
  105. package/dist/widgets/document/secret-request.widget.js +9 -0
  106. package/dist/widgets/document/secret-request.widget.js.map +1 -0
  107. package/dist/{hitl → widgets}/editor.d.ts +0 -1
  108. package/dist/widgets/editor.d.ts.map +1 -0
  109. package/dist/{hitl → widgets}/editor.js +0 -13
  110. package/dist/widgets/editor.js.map +1 -0
  111. package/dist/widgets/field/field-widgets.d.ts +6 -0
  112. package/dist/widgets/field/field-widgets.d.ts.map +1 -0
  113. package/dist/widgets/field/field-widgets.js +64 -0
  114. package/dist/widgets/field/field-widgets.js.map +1 -0
  115. package/dist/widgets/registry.d.ts +6 -0
  116. package/dist/widgets/registry.d.ts.map +1 -0
  117. package/dist/widgets/registry.js +45 -0
  118. package/dist/widgets/registry.js.map +1 -0
  119. package/dist/widgets/types.d.ts +44 -0
  120. package/dist/widgets/types.d.ts.map +1 -0
  121. package/dist/widgets/types.js +2 -0
  122. package/dist/widgets/types.js.map +1 -0
  123. package/fixtures/app/CLAUDE.md +16 -2
  124. package/fixtures/app/README.md +8 -2
  125. package/fixtures/app/docker-compose.studio.yml +10 -0
  126. package/fixtures/app/docker-compose.yml +0 -8
  127. package/fixtures/app/env.example +5 -0
  128. package/fixtures/app/src/main.ts +3 -0
  129. package/package.json +3 -3
  130. package/dist/hitl/editor.d.ts.map +0 -1
  131. package/dist/hitl/editor.js.map +0 -1
@@ -0,0 +1,34 @@
1
+ import pc from 'picocolors';
2
+ import { resolveFieldWidget } from '../field/field-widgets.js';
3
+ function fieldOrder(content, schemaProperties, order) {
4
+ const keys = schemaProperties.length > 0
5
+ ? [...schemaProperties, ...Object.keys(content).filter((key) => !schemaProperties.includes(key))]
6
+ : Object.keys(content);
7
+ if (!order?.length)
8
+ return keys;
9
+ return [...order.filter((key) => keys.includes(key)), ...keys.filter((key) => !order.includes(key))];
10
+ }
11
+ export const formWidget = (content, ctx, out) => {
12
+ const properties = (ctx.options?.properties ?? {});
13
+ const schemaProperties = (ctx.schema?.properties ?? {}) || {};
14
+ const order = Array.isArray(ctx.options?.order) ? ctx.options.order : undefined;
15
+ const body = fieldOrder(content, Object.keys(schemaProperties), order)
16
+ .flatMap((key) => {
17
+ const value = content[key];
18
+ if (value == null)
19
+ return [];
20
+ const label = properties[key]?.title ?? schemaProperties[key]?.title ?? key;
21
+ return resolveFieldWidget(properties[key]?.widget)(label, value);
22
+ })
23
+ .map((line) => ` ${line}`)
24
+ .join('\n');
25
+ const actions = ctx.options?.actions;
26
+ const hasActions = Array.isArray(actions) && actions.length > 0;
27
+ if (!body.trim() && !hasActions)
28
+ return;
29
+ out.block(`${pc.dim(`document: ${ctx.documentName}`)}${body.trim() ? `\n${body}` : ''}`);
30
+ if (hasActions) {
31
+ out.line(pc.dim(` ⧉ answer in Studio: ${ctx.studioUrl?.(ctx.workflowId) ?? ctx.workflowId}`));
32
+ }
33
+ };
34
+ //# sourceMappingURL=form.widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.widget.js","sourceRoot":"","sources":["../../../src/widgets/document/form.widget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DocumentWidget } from '../types.js';
2
+ export declare const jsonWidget: DocumentWidget;
3
+ //# sourceMappingURL=json.widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.widget.d.ts","sourceRoot":"","sources":["../../../src/widgets/document/json.widget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AASlD,eAAO,MAAM,UAAU,EAAE,cAaxB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import pc from 'picocolors';
2
+ const MAX_LINES = 40;
3
+ export const jsonWidget = (content, ctx, out) => {
4
+ const json = JSON.stringify(content, null, 2);
5
+ if (!json || json === '{}')
6
+ return;
7
+ let lines = json.split('\n');
8
+ let tail = '';
9
+ if (lines.length > MAX_LINES) {
10
+ const hidden = lines.length - MAX_LINES;
11
+ lines = lines.slice(0, MAX_LINES);
12
+ tail = `\n ${pc.dim(`… (+${hidden} lines — view in Studio)`)}`;
13
+ }
14
+ const body = lines.map((line) => ` ${line}`).join('\n');
15
+ out.block(`${pc.dim(`document: ${ctx.documentName}`)}\n${body}${tail}`);
16
+ };
17
+ //# sourceMappingURL=json.widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.widget.js","sourceRoot":"","sources":["../../../src/widgets/document/json.widget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B,MAAM,SAAS,GAAG,EAAE,CAAC;AAOrB,MAAM,CAAC,MAAM,UAAU,GAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO;IAEnC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;QACxC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAClC,IAAI,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,MAAM,0BAA0B,CAAC,EAAE,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;AAC1E,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DocumentWidget } from '../types.js';
2
+ export declare const linkWidget: DocumentWidget;
3
+ //# sourceMappingURL=link.widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.widget.d.ts","sourceRoot":"","sources":["../../../src/widgets/document/link.widget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD,eAAO,MAAM,UAAU,EAAE,cAKxB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import pc from 'picocolors';
2
+ export const linkWidget = (content, ctx, out) => {
3
+ const target = typeof content.workflowId === 'string' ? content.workflowId : undefined;
4
+ if (!target)
5
+ return;
6
+ const label = typeof content.label === 'string' ? content.label : 'sub-workflow';
7
+ out.line(pc.dim(`⧉ ${label}: ${ctx.studioUrl?.(target) ?? target}`));
8
+ };
9
+ //# sourceMappingURL=link.widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.widget.js","sourceRoot":"","sources":["../../../src/widgets/document/link.widget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAQ5B,MAAM,CAAC,MAAM,UAAU,GAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACvF,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,MAAM,KAAK,GAAG,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC;IACjF,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DocumentWidget } from '../types.js';
2
+ export declare const llmMessageWidget: DocumentWidget;
3
+ //# sourceMappingURL=llm-message.widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-message.widget.d.ts","sourceRoot":"","sources":["../../../src/widgets/document/llm-message.widget.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAmBlD,eAAO,MAAM,gBAAgB,EAAE,cAiC9B,CAAC"}
@@ -0,0 +1,97 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdirSync, writeFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import pc from 'picocolors';
6
+ const MAX_TOOL_RESULT_LINES = 8;
7
+ export const llmMessageWidget = (content, ctx, out) => {
8
+ const blocks = Array.isArray(content.blocks) ? content.blocks : [];
9
+ const streamed = typeof content.id === 'string' && content.id.length > 0 && !!ctx.streamedMessageIds?.has(content.id);
10
+ if (!streamed) {
11
+ const text = typeof content.text === 'string' && content.text.trim()
12
+ ? content.text
13
+ : blocks
14
+ .filter((block) => block.type === 'text' && typeof block.text === 'string')
15
+ .map((block) => block.text)
16
+ .join('\n');
17
+ if (text.trim()) {
18
+ const role = typeof content.role === 'string' ? `${pc.dim(`${content.role}:`)}\n` : '';
19
+ out.block(`${role}${text}`);
20
+ }
21
+ }
22
+ for (const block of blocks) {
23
+ if (block.type === 'tool_call') {
24
+ if (typeof block.id === 'string' && ctx.streamedToolCallIds?.has(block.id))
25
+ continue;
26
+ out.line(pc.dim(`⚒ ${block.name ?? 'tool'} ${JSON.stringify(block.args ?? {})}`));
27
+ }
28
+ else if (block.type === 'tool_result') {
29
+ const mark = block.isError ? pc.red('✗') : '→';
30
+ out.line(pc.dim(` ${mark} ${truncateToolResult(formatToolResult(block.content))}`));
31
+ }
32
+ }
33
+ const footer = formatCompletionMeta(content.meta);
34
+ if (footer)
35
+ out.line(pc.dim(footer));
36
+ };
37
+ function formatCompletionMeta(raw) {
38
+ if (!raw || typeof raw !== 'object')
39
+ return undefined;
40
+ const meta = raw;
41
+ const parts = [];
42
+ if (typeof meta.numTurns === 'number')
43
+ parts.push(`${meta.numTurns} turn${meta.numTurns === 1 ? '' : 's'}`);
44
+ if (typeof meta.costUsd === 'number')
45
+ parts.push(`$${meta.costUsd.toFixed(4)}`);
46
+ const inTok = fmtTokens(meta.usage?.inputTokens);
47
+ const outTok = fmtTokens(meta.usage?.outputTokens);
48
+ if (inTok && outTok)
49
+ parts.push(`${inTok} in / ${outTok} out`);
50
+ const cache = (meta.usage?.cacheReadInputTokens ?? 0) + (meta.usage?.cacheCreationInputTokens ?? 0);
51
+ if (cache)
52
+ parts.push(`${fmtTokens(cache)} cache`);
53
+ if (typeof meta.durationMs === 'number')
54
+ parts.push(`${(meta.durationMs / 1000).toFixed(1)}s`);
55
+ if (meta.model)
56
+ parts.push(meta.model);
57
+ return parts.length ? parts.join(' · ') : undefined;
58
+ }
59
+ function fmtTokens(n) {
60
+ if (n == null)
61
+ return null;
62
+ return n >= 1000 ? `${(n / 1000).toFixed(1)}k` : String(n);
63
+ }
64
+ function truncateToolResult(text) {
65
+ const lines = text.split('\n');
66
+ if (lines.length <= MAX_TOOL_RESULT_LINES)
67
+ return text;
68
+ const preview = lines.slice(0, MAX_TOOL_RESULT_LINES).join('\n');
69
+ const hidden = lines.length - MAX_TOOL_RESULT_LINES;
70
+ const file = writeFullResult(text);
71
+ const view = file ? ` — full result: ${file}` : '';
72
+ return `${preview}\n… (+${hidden} lines${view})`;
73
+ }
74
+ function writeFullResult(text) {
75
+ try {
76
+ const dir = join(tmpdir(), 'loopstack-cli');
77
+ mkdirSync(dir, { recursive: true });
78
+ const file = join(dir, `tool-result-${randomUUID()}.txt`);
79
+ writeFileSync(file, text);
80
+ return file;
81
+ }
82
+ catch {
83
+ return undefined;
84
+ }
85
+ }
86
+ function formatToolResult(content) {
87
+ if (typeof content !== 'string')
88
+ return JSON.stringify(content);
89
+ try {
90
+ const parsed = JSON.parse(content);
91
+ return typeof parsed === 'string' ? parsed : content;
92
+ }
93
+ catch {
94
+ return content;
95
+ }
96
+ }
97
+ //# sourceMappingURL=llm-message.widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-message.widget.js","sourceRoot":"","sources":["../../../src/widgets/document/llm-message.widget.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { DocumentWidget } from '../types.js';
2
+ export declare const messageWidget: DocumentWidget;
3
+ export declare const markdownWidget: DocumentWidget;
4
+ export declare const errorWidget: DocumentWidget;
5
+ //# sourceMappingURL=message.widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.widget.d.ts","sourceRoot":"","sources":["../../../src/widgets/document/message.widget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAMlD,eAAO,MAAM,aAAa,EAAE,cAc3B,CAAC;AAGF,eAAO,MAAM,cAAc,EAAE,cAI5B,CAAC;AAGF,eAAO,MAAM,WAAW,EAAE,cAIzB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import pc from 'picocolors';
2
+ export const messageWidget = (content, ctx, out) => {
3
+ const text = typeof content.text === 'string'
4
+ ? content.text
5
+ : typeof content.markdown === 'string'
6
+ ? content.markdown
7
+ : undefined;
8
+ if (!text?.trim())
9
+ return;
10
+ if (typeof content.role === 'string') {
11
+ out.block(`${pc.dim(`${content.role}:`)}\n${text}`);
12
+ }
13
+ else {
14
+ out.block(`${pc.dim(`document: ${ctx.documentName}`)}\n${indent(text)}`);
15
+ }
16
+ };
17
+ export const markdownWidget = (content, ctx, out) => {
18
+ const markdown = typeof content.markdown === 'string' ? content.markdown : undefined;
19
+ if (!markdown?.trim())
20
+ return;
21
+ out.block(`${pc.dim(`document: ${ctx.documentName}`)}\n${indent(markdown)}`);
22
+ };
23
+ export const errorWidget = (content, ctx, out) => {
24
+ const error = typeof content.error === 'string' ? content.error : undefined;
25
+ if (!error?.trim())
26
+ return;
27
+ out.block(`${pc.dim(`document: ${ctx.documentName}`)}\n${indent(pc.red(error))}`);
28
+ };
29
+ function indent(text) {
30
+ return text
31
+ .split('\n')
32
+ .map((line) => ` ${line}`)
33
+ .join('\n');
34
+ }
35
+ //# sourceMappingURL=message.widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.widget.js","sourceRoot":"","sources":["../../../src/widgets/document/message.widget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAO5B,MAAM,CAAC,MAAM,aAAa,GAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACjE,MAAM,IAAI,GACR,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;QAC9B,CAAC,CAAC,OAAO,CAAC,IAAI;QACd,CAAC,CAAC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;YACpC,CAAC,CAAC,OAAO,CAAC,QAAQ;YAClB,CAAC,CAAC,SAAS,CAAC;IAClB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;QAAE,OAAO;IAE1B,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,cAAc,GAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAClE,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACrF,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE;QAAE,OAAO;IAC9B,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC/E,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,WAAW,GAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC/D,MAAM,KAAK,GAAG,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;QAAE,OAAO;IAC3B,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,YAAY,EAAE,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AACpF,CAAC,CAAC;AAEF,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { DocumentWidget } from '../types.js';
2
+ export declare const oauthPromptWidget: DocumentWidget;
3
+ export declare function oauthHandoff(content: Record<string, unknown>): string | undefined;
4
+ //# sourceMappingURL=oauth-prompt.widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-prompt.widget.d.ts","sourceRoot":"","sources":["../../../src/widgets/document/oauth-prompt.widget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAUlD,eAAO,MAAM,iBAAiB,EAAE,cAY/B,CAAC;AAOF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAKjF"}
@@ -0,0 +1,22 @@
1
+ import pc from 'picocolors';
2
+ export const oauthPromptWidget = (content, _ctx, out) => {
3
+ const provider = typeof content.provider === 'string' ? content.provider : 'oauth';
4
+ if (content.status === 'success') {
5
+ const message = typeof content.message === 'string' ? content.message : 'Successfully connected.';
6
+ out.block(`${pc.green('✓')} ${provider} connected — ${message}`);
7
+ return;
8
+ }
9
+ const authUrl = typeof content.authUrl === 'string' ? content.authUrl : undefined;
10
+ if (!authUrl)
11
+ return;
12
+ out.block(`⧉ sign in with ${provider}: ${authUrl}`);
13
+ };
14
+ export function oauthHandoff(content) {
15
+ if (content.status === 'success')
16
+ return undefined;
17
+ if (typeof content.authUrl !== 'string')
18
+ return undefined;
19
+ const provider = typeof content.provider === 'string' ? content.provider : 'oauth';
20
+ return `waiting for browser sign-in (${provider}) — open the sign-in link above`;
21
+ }
22
+ //# sourceMappingURL=oauth-prompt.widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-prompt.widget.js","sourceRoot":"","sources":["../../../src/widgets/document/oauth-prompt.widget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAW5B,MAAM,CAAC,MAAM,iBAAiB,GAAmB,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACtE,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IAEnF,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC;QAClG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,QAAQ,gBAAgB,OAAO,EAAE,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAClF,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,GAAG,CAAC,KAAK,CAAC,kBAAkB,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC;AAOF,MAAM,UAAU,YAAY,CAAC,OAAgC;IAC3D,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACnD,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IACnF,OAAO,gCAAgC,QAAQ,iCAAiC,CAAC;AACnF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DocumentWidget } from '../types.js';
2
+ export declare const secretRequestWidget: DocumentWidget;
3
+ //# sourceMappingURL=secret-request.widget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-request.widget.d.ts","sourceRoot":"","sources":["../../../src/widgets/document/secret-request.widget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD,eAAO,MAAM,mBAAmB,EAAE,cAKjC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import pc from 'picocolors';
2
+ export const secretRequestWidget = (content, ctx, out) => {
3
+ const variables = Array.isArray(content.variables) ? content.variables : [];
4
+ const keys = variables.map((variable) => variable.key).filter((key) => typeof key === 'string');
5
+ if (keys.length === 0)
6
+ return;
7
+ out.block(`${pc.dim(`document: ${ctx.documentName}`)}\n requested secrets: ${keys.join(', ')}`);
8
+ };
9
+ //# sourceMappingURL=secret-request.widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-request.widget.js","sourceRoot":"","sources":["../../../src/widgets/document/secret-request.widget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAQ5B,MAAM,CAAC,MAAM,mBAAmB,GAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACvE,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,OAAO,CAAC,SAAiC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrG,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC;IAC/G,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC9B,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,YAAY,EAAE,CAAC,0BAA0B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnG,CAAC,CAAC"}
@@ -1,4 +1,3 @@
1
1
  export declare function buildFormSkeleton(content: unknown, schema?: Record<string, unknown>): Record<string, unknown>;
2
- export declare function describeFormFields(schema?: Record<string, unknown>): string[];
3
2
  export declare function editPayloadInEditor(initial: Record<string, unknown>, out: NodeJS.WritableStream): unknown;
4
3
  //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/widgets/editor.ts"],"names":[],"mappings":"AAiCA,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAS7G;AAQD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAqBzG"}
@@ -32,19 +32,6 @@ export function buildFormSkeleton(content, schema) {
32
32
  }
33
33
  return {};
34
34
  }
35
- export function describeFormFields(schema) {
36
- const typed = schema;
37
- if (typed?.type !== 'object' || !typed.properties)
38
- return [];
39
- const required = new Set(typed.required ?? []);
40
- return Object.entries(typed.properties).map(([key, property]) => {
41
- const parts = [property.type ?? 'any'];
42
- if (required.has(key))
43
- parts.push('required');
44
- const description = property.description ? ` — ${property.description}` : '';
45
- return ` ${key} (${parts.join(', ')})${description}`;
46
- });
47
- }
48
35
  export function editPayloadInEditor(initial, out) {
49
36
  const editor = process.env.EDITOR || process.env.VISUAL || 'vi';
50
37
  const dir = mkdtempSync(join(tmpdir(), 'loopstack-'));
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/widgets/editor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { FieldWidget } from '../types.js';
2
+ export declare function resolveFieldWidget(widgetName: string | undefined): FieldWidget;
3
+ export declare function formatEntry(key: string, value: unknown, indent: number): string[];
4
+ export declare function formatEntries(obj: Record<string, unknown>, indent: number): string[];
5
+ export declare function stripCodeFences(text: string): string;
6
+ //# sourceMappingURL=field-widgets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-widgets.d.ts","sourceRoot":"","sources":["../../../src/widgets/field/field-widgets.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAqC/C,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAG9E;AAWD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBjF;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpF;AAQD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGpD"}
@@ -0,0 +1,64 @@
1
+ import pc from 'picocolors';
2
+ const defaultField = (key, value) => formatEntry(key, value, 0);
3
+ const markdownView = (key, value) => labeledBlock(key, typeof value === 'string' ? value : JSON.stringify(value));
4
+ const codeView = (key, value) => labeledBlock(key, typeof value === 'string' ? stripCodeFences(value) : JSON.stringify(value));
5
+ const jsonField = (key, value) => labeledBlock(key, JSON.stringify(value, null, 2));
6
+ const FIELD_WIDGETS = new Map([
7
+ ['input', defaultField],
8
+ ['textarea', defaultField],
9
+ ['number', defaultField],
10
+ ['checkbox', defaultField],
11
+ ['radio', defaultField],
12
+ ['switch', defaultField],
13
+ ['select', defaultField],
14
+ ['slider', defaultField],
15
+ ['markdown-view', markdownView],
16
+ ['code-view', codeView],
17
+ ]);
18
+ export function resolveFieldWidget(widgetName) {
19
+ if (!widgetName)
20
+ return defaultField;
21
+ return FIELD_WIDGETS.get(widgetName) ?? jsonField;
22
+ }
23
+ function labeledBlock(key, text) {
24
+ return [pc.dim(`${key}:`), ...text.split('\n')];
25
+ }
26
+ export function formatEntry(key, value, indent) {
27
+ const pad = ' '.repeat(indent);
28
+ if (value == null)
29
+ return [];
30
+ if (Array.isArray(value)) {
31
+ const lines = [`${pad}${pc.dim(`${key}:`)}`];
32
+ for (const item of value) {
33
+ if (item && typeof item === 'object' && !Array.isArray(item)) {
34
+ lines.push(`${pad} -`);
35
+ lines.push(...formatEntries(item, indent + 2));
36
+ }
37
+ else {
38
+ lines.push(`${pad} - ${formatScalar(item)}`);
39
+ }
40
+ }
41
+ return lines;
42
+ }
43
+ if (typeof value === 'object') {
44
+ return [`${pad}${pc.dim(`${key}:`)}`, ...formatEntries(value, indent + 1)];
45
+ }
46
+ const text = formatScalar(value);
47
+ if (text.includes('\n')) {
48
+ return [`${pad}${pc.dim(`${key}:`)}`, ...text.split('\n').map((line) => `${pad}${line}`)];
49
+ }
50
+ return [`${pad}${pc.dim(`${key}:`)} ${text}`];
51
+ }
52
+ export function formatEntries(obj, indent) {
53
+ return Object.entries(obj).flatMap(([key, value]) => formatEntry(key, value, indent));
54
+ }
55
+ function formatScalar(value) {
56
+ if (typeof value === 'string')
57
+ return stripCodeFences(value);
58
+ return JSON.stringify(value);
59
+ }
60
+ export function stripCodeFences(text) {
61
+ const match = text.trim().match(/^```[^\n]*\n([\s\S]*?)\n?```$/);
62
+ return match ? match[1] : text;
63
+ }
64
+ //# sourceMappingURL=field-widgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-widgets.js","sourceRoot":"","sources":["../../../src/widgets/field/field-widgets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { CollectWidget, DocumentWidget } from './types.js';
2
+ export declare function resolveDocumentWidget(widgetName: string | undefined): DocumentWidget | undefined;
3
+ export declare function resolveCollectWidget(widgetName: string | undefined): CollectWidget | undefined;
4
+ export declare function isCollectable(widgetName: string | undefined): boolean;
5
+ export declare function resolveHandoff(widgetName: string | undefined, content: Record<string, unknown>): string | undefined;
6
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/widgets/registry.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAa,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAqC3E,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAKhG;AAGD,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAE9F;AAGD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAErE;AAGD,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAEnH"}
@@ -0,0 +1,45 @@
1
+ import { collectForm } from './collect/form.collect.js';
2
+ import { collectChoices, collectConfirm, collectText } from './collect/prompts.collect.js';
3
+ import { collectSecretInput } from './collect/secret-input.collect.js';
4
+ import { collectButton, collectPromptInput } from './collect/workflow.collect.js';
5
+ import { formWidget } from './document/form.widget.js';
6
+ import { jsonWidget } from './document/json.widget.js';
7
+ import { linkWidget } from './document/link.widget.js';
8
+ import { llmMessageWidget } from './document/llm-message.widget.js';
9
+ import { errorWidget, markdownWidget, messageWidget } from './document/message.widget.js';
10
+ import { oauthHandoff, oauthPromptWidget } from './document/oauth-prompt.widget.js';
11
+ import { secretRequestWidget } from './document/secret-request.widget.js';
12
+ const WIDGETS = new Map([
13
+ ['llm-message', { render: llmMessageWidget }],
14
+ ['message', { render: messageWidget }],
15
+ ['plain', { render: messageWidget }],
16
+ ['markdown', { render: markdownWidget }],
17
+ ['error', { render: errorWidget }],
18
+ ['link', { render: linkWidget }],
19
+ ['form', { render: formWidget, collect: collectForm }],
20
+ ['secret-input', { render: secretRequestWidget, collect: collectSecretInput }],
21
+ ['oauth-prompt', { render: oauthPromptWidget, handoff: oauthHandoff }],
22
+ ['text-prompt', { collect: collectText }],
23
+ ['confirm-prompt', { collect: collectConfirm }],
24
+ ['choices', { collect: collectChoices }],
25
+ ['prompt-input', { collect: collectPromptInput }],
26
+ ['button', { collect: collectButton }],
27
+ ]);
28
+ export function resolveDocumentWidget(widgetName) {
29
+ if (!widgetName)
30
+ return undefined;
31
+ const entry = WIDGETS.get(widgetName);
32
+ if (entry)
33
+ return entry.render;
34
+ return jsonWidget;
35
+ }
36
+ export function resolveCollectWidget(widgetName) {
37
+ return widgetName ? WIDGETS.get(widgetName)?.collect : undefined;
38
+ }
39
+ export function isCollectable(widgetName) {
40
+ return resolveCollectWidget(widgetName) !== undefined;
41
+ }
42
+ export function resolveHandoff(widgetName, content) {
43
+ return widgetName ? WIDGETS.get(widgetName)?.handoff?.(content) : undefined;
44
+ }
45
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/widgets/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAU1E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAoB;IACzC,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC7C,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACtC,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACpC,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACxC,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAClC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAChC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IACtD,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAG9E,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAGtE,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IACzC,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IAC/C,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IAGxC,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;IACjD,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;CACvC,CAAC,CAAC;AAOH,MAAM,UAAU,qBAAqB,CAAC,UAA8B;IAClE,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACtC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IAC/B,OAAO,UAAU,CAAC;AACpB,CAAC;AAGD,MAAM,UAAU,oBAAoB,CAAC,UAA8B;IACjE,OAAO,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAGD,MAAM,UAAU,aAAa,CAAC,UAA8B;IAC1D,OAAO,oBAAoB,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC;AACxD,CAAC;AAGD,MAAM,UAAU,cAAc,CAAC,UAA8B,EAAE,OAAgC;IAC7F,OAAO,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,44 @@
1
+ export interface WidgetContext {
2
+ documentName: string;
3
+ workflowId: string;
4
+ options?: Record<string, unknown>;
5
+ schema?: Record<string, unknown>;
6
+ streamedMessageIds?: ReadonlySet<string>;
7
+ streamedToolCallIds?: ReadonlySet<string>;
8
+ studioUrl?: (workflowId: string) => string | undefined;
9
+ }
10
+ export interface WidgetOutput {
11
+ block(text: string): void;
12
+ line(text: string): void;
13
+ }
14
+ export type DocumentWidget = (content: Record<string, unknown>, ctx: WidgetContext, out: WidgetOutput) => void;
15
+ export type FieldWidget = (key: string, value: unknown) => string[];
16
+ export interface PromptAnswer {
17
+ transitionId: string;
18
+ payload: unknown;
19
+ }
20
+ export interface CollectHttp {
21
+ get<T = unknown>(path: string): Promise<T>;
22
+ put<T = unknown>(path: string, body?: unknown): Promise<T>;
23
+ }
24
+ export interface CollectContext {
25
+ content: Record<string, unknown>;
26
+ documentName?: string;
27
+ options?: Record<string, unknown>;
28
+ schema?: Record<string, unknown>;
29
+ availableTransitions: string[];
30
+ workspaceId?: string;
31
+ http?: CollectHttp;
32
+ }
33
+ export interface CollectIo {
34
+ ask(query: string): Promise<string>;
35
+ askSecret(query: string): Promise<string>;
36
+ out: NodeJS.WritableStream;
37
+ }
38
+ export type CollectWidget = (ctx: CollectContext, io: CollectIo) => Promise<PromptAnswer | undefined>;
39
+ export interface CliWidget {
40
+ render?: DocumentWidget;
41
+ collect?: CollectWidget;
42
+ handoff?: (content: Record<string, unknown>) => string | undefined;
43
+ }
44
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/widgets/types.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IAErB,UAAU,EAAE,MAAM,CAAC;IAEnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjC,kBAAkB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAEzC,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAE1C,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,YAAY;IAE3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,KAAK,IAAI,CAAC;AAG/G,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,MAAM,EAAE,CAAC;AAGpE,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAOD,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3C,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC5D;AAGD,MAAM,WAAW,cAAc;IAE7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjC,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAE/B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IAExB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1C,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC;CAC5B;AAOD,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;AAGtG,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,OAAO,CAAC,EAAE,aAAa,CAAC;IAMxB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;CACpE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/widgets/types.ts"],"names":[],"mappings":""}