@dotit/core 1.0.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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +229 -0
  3. package/dist/aliases.d.ts +1 -0
  4. package/dist/aliases.js +8 -0
  5. package/dist/ask.d.ts +7 -0
  6. package/dist/ask.js +55 -0
  7. package/dist/browser.d.ts +12 -0
  8. package/dist/browser.js +32 -0
  9. package/dist/diff.d.ts +17 -0
  10. package/dist/diff.js +179 -0
  11. package/dist/document-css.d.ts +1 -0
  12. package/dist/document-css.js +290 -0
  13. package/dist/executor.d.ts +40 -0
  14. package/dist/executor.js +501 -0
  15. package/dist/history.d.ts +10 -0
  16. package/dist/history.js +297 -0
  17. package/dist/html-to-it.d.ts +1 -0
  18. package/dist/html-to-it.js +288 -0
  19. package/dist/index-builder.d.ts +62 -0
  20. package/dist/index-builder.js +228 -0
  21. package/dist/index.d.ts +39 -0
  22. package/dist/index.js +94 -0
  23. package/dist/language-registry.d.ts +39 -0
  24. package/dist/language-registry.js +530 -0
  25. package/dist/markdown.d.ts +1 -0
  26. package/dist/markdown.js +123 -0
  27. package/dist/merge.d.ts +6 -0
  28. package/dist/merge.js +255 -0
  29. package/dist/parser.d.ts +29 -0
  30. package/dist/parser.js +1562 -0
  31. package/dist/query.d.ts +32 -0
  32. package/dist/query.js +293 -0
  33. package/dist/renderer.d.ts +16 -0
  34. package/dist/renderer.js +1286 -0
  35. package/dist/schema.d.ts +47 -0
  36. package/dist/schema.js +574 -0
  37. package/dist/source.d.ts +3 -0
  38. package/dist/source.js +223 -0
  39. package/dist/theme.d.ts +49 -0
  40. package/dist/theme.js +113 -0
  41. package/dist/themes/corporate.json +86 -0
  42. package/dist/themes/dark.json +64 -0
  43. package/dist/themes/editorial.json +54 -0
  44. package/dist/themes/legal.json +57 -0
  45. package/dist/themes/minimal.json +50 -0
  46. package/dist/themes/print.json +54 -0
  47. package/dist/themes/technical.json +59 -0
  48. package/dist/themes/warm.json +53 -0
  49. package/dist/trust.d.ts +66 -0
  50. package/dist/trust.js +200 -0
  51. package/dist/types.d.ts +234 -0
  52. package/dist/types.js +19 -0
  53. package/dist/utils.d.ts +2 -0
  54. package/dist/utils.js +13 -0
  55. package/dist/validate.d.ts +13 -0
  56. package/dist/validate.js +711 -0
  57. package/dist/workflow.d.ts +18 -0
  58. package/dist/workflow.js +160 -0
  59. package/package.json +51 -0
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DOCUMENT_CSS = void 0;
4
+ exports.DOCUMENT_CSS = `
5
+ /* ── Base ──────────────────────────────────────────────── */
6
+ .intent-document{font-family:Georgia,'Times New Roman',serif;line-height:1.7;color:#111;max-width:680px;margin:0 auto;padding:32px 24px;}
7
+ /* ── Typography ────────────────────────────────────────── */
8
+ .intent-title{font-size:1.75rem;line-height:1.2;margin:0 0 12px;font-weight:700;letter-spacing:-0.01em;}
9
+ .intent-summary{margin:8px 0 20px;padding:8px 0 8px 14px;border-left:2px solid #999;color:#333;font-style:italic;font-size:0.95rem;}
10
+ .intent-section{margin:24px 0 8px;font-size:1.1rem;line-height:1.3;font-weight:600;padding-bottom:4px;border-bottom:1px solid #ccc;}
11
+ .intent-sub{margin:16px 0 6px;font-size:1rem;line-height:1.3;font-weight:600;}
12
+ .intent-note{margin:6px 0;color:#222;}
13
+ .intent-prose{margin:0 0 1em;color:#222;font-size:1rem;line-height:1.8;max-width:65ch;text-wrap:pretty;}
14
+ .intent-align-center{text-align:center;}
15
+ .intent-align-right{text-align:right;}
16
+ .intent-align-justify{text-align:justify;}
17
+ /* ── Divider ───────────────────────────────────────────── */
18
+ .intent-divider{margin:18px 0;text-align:center;}
19
+ .intent-divider-line{border:none;border-top:1px solid #ccc;margin:0;}
20
+ .intent-divider-label{display:inline-block;padding:0 10px;background:#fff;color:#888;font-size:0.78rem;position:relative;top:-9px;}
21
+ /* ── Tasks ─────────────────────────────────────────────── */
22
+ .intent-task{display:flex;align-items:flex-start;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}
23
+ .intent-task-checkbox{margin-top:3px;flex-shrink:0;}
24
+ .intent-task-text{flex:1;}
25
+ .intent-task-meta{display:flex;gap:6px;color:#888;font-size:0.78rem;white-space:nowrap;}
26
+ .intent-task-owner::before{content:'@ ';opacity:0.6;}
27
+ .intent-task-due::before{content:'due ';}
28
+ .intent-task-time::before{content:'at ';}
29
+ .intent-task-text-done{text-decoration:line-through;color:#999;}
30
+ /* ── Ask ───────────────────────────────────────────────── */
31
+ .intent-ask{display:flex;gap:10px;margin:10px 0;padding:6px 0 6px 12px;border-left:2px solid #999;align-items:baseline;}
32
+ .intent-ask-label{font-size:0.68rem;font-weight:700;text-transform:uppercase;letter-spacing:0.08em;color:#555;flex-shrink:0;line-height:1.65;}
33
+ .intent-ask-content{flex:1;color:#333;font-style:italic;}
34
+ /* ── Quote ─────────────────────────────────────────────── */
35
+ .intent-quote{margin:14px 0;padding:2px 0 2px 16px;border-left:2px solid #999;font-style:italic;color:#333;}
36
+ .intent-quote p{margin:0;line-height:1.7;}
37
+ .intent-quote-cite{display:block;margin-top:5px;font-style:normal;color:#888;font-size:0.82rem;}
38
+ /* ── Code ──────────────────────────────────────────────── */
39
+ .intent-code{margin:10px 0;padding:10px 12px;background:#f5f5f5;border:1px solid #ddd;overflow-x:auto;}
40
+ .intent-code code{font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:0.85rem;color:#111;}
41
+ /* ── Table ─────────────────────────────────────────────── */
42
+ .intent-table{width:100%;border-collapse:collapse;margin:12px 0;font-size:0.9em;}
43
+ .intent-table th,.intent-table-th{padding:6px 10px;text-align:left;font-weight:600;font-size:0.78rem;text-transform:uppercase;letter-spacing:0.04em;border-bottom:2px solid #333;}
44
+ .intent-table td,.intent-table-td{padding:6px 10px;text-align:left;border-bottom:1px solid #ddd;vertical-align:top;}
45
+ .intent-row:last-child .intent-table-td,.intent-row:last-child td{border-bottom:none;}
46
+ /* ── Image ─────────────────────────────────────────────── */
47
+ .intent-image{margin:12px 0;}
48
+ .intent-image-img{max-width:100%;height:auto;border:1px solid #ddd;}
49
+ .intent-image-caption{margin-top:4px;color:#555;font-size:0.82rem;text-align:center;font-style:italic;}
50
+ /* ── Links / Refs ──────────────────────────────────────── */
51
+ .intent-link{margin:4px 0;}
52
+ .intent-link a{color:#111;text-decoration:underline;}
53
+ .intent-ref{margin:4px 0;}
54
+ .intent-ref a{color:#111;text-decoration:underline;font-style:italic;}
55
+ .intent-unknown{margin:6px 0;padding:6px 10px;border:1px dashed #ccc;color:#888;}
56
+ /* ── Embed ─────────────────────────────────────────────── */
57
+ .intent-embed{margin:14px 0;}
58
+ .intent-embed iframe,.intent-embed video,.intent-embed audio{display:block;width:100%;border:1px solid #ddd;}
59
+ /* ── Callouts ──────────────────────────────────────────── */
60
+ .intent-callout{display:flex;gap:10px;margin:10px 0;padding:6px 0 6px 12px;border-left:2px solid #888;align-items:baseline;}
61
+ .intent-callout-label{font-size:0.68rem;font-weight:700;text-transform:uppercase;letter-spacing:0.08em;flex-shrink:0;white-space:nowrap;line-height:1.65;color:#444;}
62
+ .intent-callout-content{flex:1;color:#222;}
63
+ .intent-info{border-color:#888;}
64
+ .intent-info .intent-callout-label{color:#444;}
65
+ .intent-warning{border-color:#888;}
66
+ .intent-warning .intent-callout-label{color:#444;}
67
+ .intent-tip{border-color:#888;}
68
+ .intent-tip .intent-callout-label{color:#444;}
69
+ .intent-success{border-color:#888;}
70
+ .intent-success .intent-callout-label{color:#444;}
71
+ /* ── Inline formatting ─────────────────────────────────── */
72
+ .intent-inline-link{color:#111;text-decoration:underline;}
73
+ .intent-inline-highlight{background:#eee;padding:0 .15em;}
74
+ .intent-inline-note{display:inline-block;padding:0 .3em;border:1px solid #ddd;color:#333;font-size:.92em;}
75
+ .intent-inline-quote{color:#333;font-style:italic;}
76
+ .intent-inline-date{font-weight:600;font-family:'SFMono-Regular',Consolas,monospace;}
77
+ .intent-inline-mention{font-weight:600;}
78
+ .intent-inline-tag{font-weight:600;}
79
+ /* ── Lists ─────────────────────────────────────────────── */
80
+ ul,ol{margin:6px 0 6px 20px;padding:0;}
81
+ li{margin:3px 0;color:#222;}
82
+ /* ── v2 Agentic Workflow Blocks ────────────────────────── */
83
+ .intent-step{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}
84
+ .intent-step-icon{font-size:0.85rem;flex-shrink:0;}
85
+ .intent-step-content{flex:1;font-weight:500;}
86
+ .intent-step-meta{display:flex;gap:5px;align-items:center;flex-wrap:wrap;}
87
+ .intent-step-id{font-size:0.72rem;color:#888;font-family:monospace;}
88
+ .intent-step-depends{font-size:0.75rem;color:#555;font-style:italic;}
89
+ .intent-badge{font-size:0.7rem;padding:1px 6px;border:1px solid #bbb;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;}
90
+ .intent-badge-tool{border-color:#999;}
91
+ .intent-status-pending{color:#666;}
92
+ .intent-status-running{color:#333;animation:intent-pulse 1.5s ease-in-out infinite;}
93
+ .intent-status-blocked{color:#666;}
94
+ .intent-status-failed{color:#333;text-decoration:line-through;}
95
+ .intent-status-done{color:#333;}
96
+ .intent-status-skipped,.intent-status-cancelled{color:#999;text-decoration:line-through;}
97
+ @keyframes intent-pulse{0%,100%{opacity:1;}50%{opacity:0.4;}}
98
+ .intent-decision{display:flex;gap:10px;margin:8px 0;padding:8px 12px;border:1px solid #bbb;}
99
+ .intent-decision-diamond{width:16px;height:16px;border:2px solid #333;transform:rotate(45deg);flex-shrink:0;margin-top:4px;}
100
+ .intent-decision-body{flex:1;}
101
+ .intent-decision-label{font-weight:600;margin-bottom:3px;}
102
+ .intent-decision-condition{font-size:0.85rem;color:#444;font-family:monospace;margin-bottom:3px;}
103
+ .intent-decision-branches{display:flex;gap:14px;font-size:0.82rem;}
104
+ .intent-decision-then{color:#333;}
105
+ .intent-decision-else{color:#333;}
106
+ .intent-trigger{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}
107
+ .intent-trigger-icon{font-size:1rem;}
108
+ .intent-trigger-content{flex:1;font-weight:500;}
109
+ .intent-badge-event{border-color:#999;}
110
+ .intent-loop{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}
111
+ .intent-loop-icon{font-size:1rem;}
112
+ .intent-loop-content{flex:1;font-weight:500;}
113
+ .intent-loop-over,.intent-loop-do{font-size:0.8rem;color:#555;font-family:monospace;}
114
+ .intent-checkpoint{display:flex;align-items:center;gap:8px;margin:16px 0;color:#555;font-size:0.85rem;font-weight:600;text-transform:uppercase;letter-spacing:0.06em;}
115
+ .intent-checkpoint-flag{font-size:1rem;}
116
+ .intent-checkpoint-label{flex-shrink:0;}
117
+ .intent-checkpoint-line{flex:1;border:none;border-top:1px dashed #bbb;margin:0;}
118
+ .intent-audit{margin:4px 0;padding:4px 8px;font-family:'SFMono-Regular',Consolas,monospace;font-size:0.8rem;color:#555;border-left:2px solid #bbb;}
119
+ .intent-audit-prefix{color:#888;font-weight:600;}
120
+ .intent-error-block{border-color:#999;}
121
+ .intent-error-block .intent-callout-label{color:#333;}
122
+ .intent-error-fallback{font-size:0.8rem;color:#555;font-style:italic;margin-left:6px;}
123
+ .intent-error-notify{font-size:0.8rem;color:#555;margin-left:6px;}
124
+ .intent-context-table{width:auto;border-collapse:collapse;margin:6px 0;font-size:0.85rem;}
125
+ .intent-context-key{padding:3px 10px 3px 8px;font-weight:600;color:#333;font-family:monospace;border-bottom:1px solid #ddd;}
126
+ .intent-context-val{padding:3px 12px 3px 6px;color:#333;font-family:monospace;border-bottom:1px solid #ddd;}
127
+ .intent-context{margin:4px 0;font-size:0.85rem;color:#333;}
128
+ .intent-progress{display:flex;align-items:center;gap:8px;margin:6px 0;}
129
+ .intent-progress-label{font-size:0.85rem;color:#222;flex-shrink:0;}
130
+ .intent-progress-bar{flex:1;height:6px;background:#ddd;overflow:hidden;}
131
+ .intent-progress-fill{height:100%;background:#555;}
132
+ .intent-progress-pct{font-size:0.78rem;color:#555;font-weight:600;min-width:36px;text-align:right;}
133
+ .intent-file-ref{display:flex;align-items:center;gap:6px;margin:4px 0;padding:4px 8px;border:1px dashed #ccc;font-size:0.82rem;color:#555;font-family:monospace;}
134
+ .intent-file-ref-icon{font-size:0.9rem;}
135
+ /* ── v2.1 Agentic Workflow Blocks ──────────────────────── */
136
+ .intent-emit-block{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;}
137
+ .intent-emit-icon{font-size:1rem;}
138
+ .intent-emit-content{flex:1;font-weight:500;}
139
+ .intent-emit-meta{display:flex;gap:5px;align-items:center;}
140
+ .intent-emit-phase{font-size:0.78rem;color:#555;font-weight:600;}
141
+ .intent-badge-level{border-color:#999;}
142
+ .intent-result{display:flex;align-items:flex-start;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;flex-wrap:wrap;}
143
+ .intent-result-success{border-color:#999;}
144
+ .intent-result-error,.intent-result-failure{border-color:#999;}
145
+ .intent-result-icon{font-size:1rem;flex-shrink:0;}
146
+ .intent-result-content{flex:1;font-weight:500;}
147
+ .intent-badge-code{border-color:#999;font-family:monospace;}
148
+ .intent-result-data{width:100%;margin-top:3px;padding:4px 8px;font-size:0.82rem;overflow-x:auto;border-top:1px solid #ddd;}
149
+ .intent-result-data code{font-family:'SFMono-Regular',Consolas,monospace;font-size:0.82rem;color:#333;}
150
+ .intent-handoff{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;}
151
+ .intent-handoff-icon{font-size:1rem;}
152
+ .intent-handoff-content{flex:1;font-weight:500;}
153
+ .intent-handoff-arrow{display:flex;align-items:center;gap:5px;font-size:0.82rem;color:#444;font-weight:600;}
154
+ .intent-handoff-agent{padding:1px 5px;border:1px solid #bbb;font-family:monospace;font-size:0.78rem;}
155
+ .intent-wait{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;border-left:2px solid #999;}
156
+ .intent-wait-icon{font-size:1rem;animation:intent-pulse 2s ease-in-out infinite;}
157
+ .intent-wait-content{flex:1;font-weight:500;color:#333;}
158
+ .intent-wait-meta{display:flex;gap:5px;align-items:center;}
159
+ .intent-badge-timeout{border-color:#999;font-family:monospace;}
160
+ .intent-wait-fallback{font-size:0.8rem;color:#555;font-style:italic;}
161
+ .intent-parallel{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;}
162
+ .intent-parallel-icon{font-size:1rem;}
163
+ .intent-parallel-content{flex:1;font-weight:500;}
164
+ .intent-parallel-steps{display:flex;gap:4px;flex-wrap:wrap;}
165
+ .intent-badge-parallel-step{border-color:#999;font-family:monospace;font-size:0.72rem;padding:1px 5px;}
166
+ .intent-badge-join{border-color:#999;font-size:0.72rem;padding:1px 5px;}
167
+ .intent-retry{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;}
168
+ .intent-retry-icon{font-size:1rem;}
169
+ .intent-retry-content{flex:1;font-weight:500;}
170
+ .intent-retry-meta{display:flex;gap:5px;align-items:center;}
171
+ .intent-badge-retry-max{border-color:#999;font-size:0.72rem;}
172
+ .intent-badge-retry-delay{border-color:#999;font-size:0.72rem;font-family:monospace;}
173
+ .intent-badge-retry-backoff{border-color:#999;font-size:0.72rem;font-style:italic;}
174
+ /* ── v2.2 Agentic Workflow Blocks ──────────────────────── */
175
+ .intent-gate{display:flex;gap:10px;margin:8px 0;padding:10px 12px;border:2px solid #888;}
176
+ .intent-gate-icon{font-size:1.2rem;flex-shrink:0;margin-top:2px;}
177
+ .intent-gate-body{flex:1;}
178
+ .intent-gate-label{font-weight:600;margin-bottom:3px;}
179
+ .intent-gate-meta{display:flex;gap:5px;align-items:center;flex-wrap:wrap;}
180
+ .intent-badge-approver{border-color:#999;font-family:monospace;}
181
+ .intent-gate-fallback{font-size:0.8rem;color:#555;font-style:italic;}
182
+ .intent-call{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px dashed #999;margin:5px 0;}
183
+ .intent-call-icon{font-size:1rem;}
184
+ .intent-call-content{flex:1;font-weight:500;font-family:monospace;font-size:0.9rem;}
185
+ .intent-call-meta{display:flex;gap:6px;align-items:center;}
186
+ .intent-call-input{font-size:0.78rem;color:#555;font-family:monospace;}
187
+ .intent-call-output{font-size:0.78rem;color:#555;font-family:monospace;}
188
+ /* ── v2.5 Document Generation Blocks ───────────────────── */
189
+ .it-page-break{page-break-after:always;break-after:page;height:0;}
190
+ .it-byline{margin:0 0 16px;font-size:0.9em;color:#333;}
191
+ .it-byline-author{display:block;font-weight:bold;}
192
+ .it-byline-meta{display:block;font-size:0.85em;color:#666;margin-top:2px;}
193
+ .it-epigraph{font-style:italic;text-align:center;margin:20px 3em;border:none;padding:0;}
194
+ .it-epigraph p{margin:0;}
195
+ .it-epigraph .it-epigraph-by{display:block;text-align:right;font-size:0.9em;margin-top:4px;font-style:normal;color:#666;}
196
+ .it-caption{font-size:0.85em;font-style:italic;text-align:center;color:#444;margin-top:3px;margin-bottom:10px;}
197
+ .it-dedication{font-style:italic;text-align:center;margin:3em auto;}
198
+ .it-toc{margin:20px 0;}
199
+ .it-toc-title{font-size:1.1rem;font-weight:600;margin-bottom:8px;border:none;}
200
+ .it-toc ol{list-style:none;padding:0;margin:0;}
201
+ .it-toc li{margin:3px 0;}
202
+ .it-toc li a{color:#111;text-decoration:none;border-bottom:1px dotted #bbb;}
203
+ .it-toc li a:hover{border-bottom-style:solid;}
204
+ .it-toc .it-toc-sub{padding-left:20px;font-size:0.92em;}
205
+ .it-footnotes{border-top:1px solid #ccc;margin-top:24px;padding-top:8px;font-size:0.85em;color:#444;}
206
+ .it-footnotes ol{padding-left:1.5em;margin:0;}
207
+ .it-footnotes li{margin:3px 0;}
208
+ sup.it-fn-ref{font-size:0.7em;vertical-align:super;}
209
+ sup.it-fn-ref a{color:#111;text-decoration:none;border-bottom:1px solid #999;}
210
+ /* ── v2.8 Document Trust ───────────────────────────────── */
211
+ .it-approval{display:flex;gap:10px;margin:10px 0;padding:10px 14px;border:1px solid #4caf50;background:#f8fdf8;}
212
+ .it-approval__icon{font-size:1.2rem;color:#4caf50;flex-shrink:0;}
213
+ .it-approval__body{display:flex;flex-direction:column;gap:2px;}
214
+ .it-approval__label{font-size:0.72rem;font-weight:700;text-transform:uppercase;letter-spacing:0.08em;color:#4caf50;}
215
+ .it-approval__who{font-size:0.9rem;color:#222;}
216
+ .it-approval__date{font-size:0.8rem;color:#666;}
217
+ .it-signature{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:10px 0;padding:10px 14px;border:1px solid #daa520;background:#fffdf5;}
218
+ .it-signature--valid{border-color:#4caf50;background:#f8fdf8;}
219
+ .it-signature--invalid{border-color:#c62828;background:#fdf5f5;}
220
+ .it-signature__name{font-weight:600;font-size:0.95rem;color:#111;}
221
+ .it-signature__role{font-size:0.85rem;color:#555;}
222
+ .it-signature__date{font-size:0.8rem;color:#666;}
223
+ .it-signature__status{font-size:0.8rem;font-weight:600;margin-left:auto;}
224
+ .it-sealed-banner{display:flex;gap:10px;align-items:center;margin:16px 0;padding:12px 16px;border:2px solid #c62828;background:#fdf5f5;font-weight:600;}
225
+ .it-sealed-banner__icon{font-size:1.3rem;}
226
+ .it-sealed-banner__text{font-size:1rem;color:#c62828;text-transform:uppercase;letter-spacing:0.04em;}
227
+ .it-sealed-banner__date{font-size:0.8rem;color:#666;margin-left:auto;}
228
+ .it-sealed-banner__hash{font-size:0.72rem;color:#888;font-family:monospace;}
229
+ /* ── v2.11 Keyword Expansion ──────────────────────────── */
230
+ .it-ref-card{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}
231
+ .it-ref-icon{font-size:1rem;flex-shrink:0;}
232
+ .it-ref-link{color:#111;text-decoration:underline;font-weight:500;}
233
+ .it-ref-name{font-weight:500;}
234
+ .it-ref-rel{font-size:0.7rem;padding:1px 6px;border:1px solid #bbb;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;}
235
+ .it-def{margin:6px 0;padding:4px 0;}
236
+ .it-def-term{font-weight:700;font-size:0.95rem;color:#111;}
237
+ .it-def-abbr{font-weight:400;color:#555;}
238
+ .it-def-meaning{margin:2px 0 0 0;color:#333;font-size:0.92rem;padding-left:1em;}
239
+ .it-metric{display:inline-block;padding:10px 14px;border:1px solid #ddd;margin:5px;min-width:140px;vertical-align:top;}
240
+ .it-metric-name{font-size:0.78rem;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;color:#555;}
241
+ .it-metric-value{font-size:1.6rem;font-weight:700;line-height:1.2;color:#111;}
242
+ .it-metric-unit{font-size:0.85rem;font-weight:400;color:#666;margin-left:2px;}
243
+ .it-metric-target{font-size:0.78rem;color:#888;}
244
+ .it-metric-trend{font-size:1rem;font-weight:700;margin-top:2px;}
245
+ .it-metric-period{font-size:0.72rem;color:#888;}
246
+ .it-metric-green{border-color:#4caf50;}
247
+ .it-metric-green .it-metric-value{color:#2e7d32;}
248
+ .it-metric-red{border-color:#c62828;}
249
+ .it-metric-red .it-metric-value{color:#c62828;}
250
+ .it-metric-neutral{border-color:#ddd;}
251
+ /* Document total/line rows (invoice, receipt, statement) — matches the editor's
252
+ itMetric node so editor-designed templates print identically. */
253
+ .it-metric-row{display:flex;align-items:baseline;justify-content:space-between;gap:16px;padding:5px 0;border-bottom:1px solid var(--it-color-border,#e5e7eb);}
254
+ .it-metric-row__label{color:var(--it-color-muted,#555);}
255
+ .it-metric-row__value{font-variant-numeric:tabular-nums;font-weight:600;color:var(--it-color-text,#111);white-space:nowrap;}
256
+ .it-metric-row--total{border-bottom:none;border-top:2px solid var(--it-color-text,#333);margin-top:2px;padding-top:8px;font-size:1.05em;}
257
+ .it-metric-row--total .it-metric-row__label{color:var(--it-color-text,#111);font-weight:600;}
258
+ .it-amendment{margin:10px 0;padding:10px 14px;border:2px solid #e65100;background:#fff8e1;}
259
+ .it-amendment-header{display:flex;align-items:center;gap:8px;margin-bottom:6px;}
260
+ .it-amendment-icon{font-size:1rem;}
261
+ .it-amendment-ref{font-size:0.72rem;font-weight:700;padding:1px 6px;border:1px solid #e65100;color:#e65100;text-transform:uppercase;letter-spacing:0.04em;}
262
+ .it-amendment-title{font-weight:600;color:#111;}
263
+ .it-amendment-section{font-size:0.85rem;color:#555;font-style:italic;}
264
+ .it-amendment-was{font-size:0.85rem;color:#c62828;text-decoration:line-through;}
265
+ .it-amendment-now{font-size:0.85rem;color:#2e7d32;font-weight:500;}
266
+ .it-amendment-meta{display:flex;gap:8px;margin-top:4px;font-size:0.8rem;color:#666;}
267
+ .it-figure{margin:14px 0;}
268
+ .it-figure img{display:block;margin:0 auto;border:1px solid #ddd;}
269
+ .it-figure-caption{font-size:0.85em;font-style:italic;text-align:center;color:#444;margin-top:6px;}
270
+ .it-signline{margin:20px 0;padding:0;}
271
+ .it-signline-label{font-size:0.72rem;color:#888;text-transform:uppercase;letter-spacing:0.06em;margin-bottom:4px;}
272
+ .it-signline-rule{border-bottom:1px solid #111;margin-bottom:4px;}
273
+ .it-signline-name{font-size:0.9rem;font-weight:500;color:#111;}
274
+ .it-signline-role{font-size:0.82rem;color:#555;}
275
+ .it-signline-date{font-size:0.82rem;color:#555;margin-top:4px;}
276
+ .it-contact{padding:8px 12px;border:1px solid #ddd;margin:5px 0;}
277
+ .it-contact-name{font-weight:600;font-size:0.95rem;color:#111;}
278
+ .it-contact-role{font-size:0.82rem;color:#555;}
279
+ .it-contact-org{font-size:0.82rem;color:#555;}
280
+ .it-contact-email a,.it-contact-phone a,.it-contact-url a{color:#111;text-decoration:underline;font-size:0.85rem;}
281
+ .it-deadline{padding:8px 12px;border-left:3px solid #4caf50;margin:5px 0;}
282
+ .it-deadline-name{font-weight:600;color:#111;}
283
+ .it-deadline-date{font-size:0.9rem;font-weight:600;color:#111;}
284
+ .it-deadline-consequence{font-size:0.85rem;color:#555;font-style:italic;}
285
+ .it-deadline-owner{font-size:0.82rem;color:#555;}
286
+ .it-deadline-authority{font-size:0.82rem;color:#555;}
287
+ .it-deadline-green{border-color:#4caf50;}
288
+ .it-deadline-amber{border-color:#f57c00;}
289
+ .it-deadline-red{border-color:#c62828;}
290
+ `;
@@ -0,0 +1,40 @@
1
+ import { IntentDocument, IntentBlock } from "./types";
2
+ export type ToolHandler = (input: unknown, context: ExecutionContext) => Promise<unknown> | unknown;
3
+ export interface WorkflowRuntime {
4
+ tools?: Record<string, ToolHandler>;
5
+ context?: Record<string, unknown>;
6
+ onGate?: (gate: IntentBlock, context: ExecutionContext) => Promise<boolean>;
7
+ onStepStart?: (step: IntentBlock, context: ExecutionContext) => void;
8
+ onStepComplete?: (step: IntentBlock, output: unknown, context: ExecutionContext) => void;
9
+ onStepError?: (step: IntentBlock, error: Error, context: ExecutionContext) => void;
10
+ onAudit?: (audit: IntentBlock, context: ExecutionContext) => void;
11
+ options?: ExecutionOptions;
12
+ }
13
+ export interface ExecutionOptions {
14
+ maxSteps?: number;
15
+ stepTimeout?: number;
16
+ unknownTool?: "skip" | "error" | "warn";
17
+ dryRun?: boolean;
18
+ }
19
+ export type ExecutionContext = Record<string, unknown>;
20
+ export interface ExecutionResult {
21
+ document: IntentDocument;
22
+ context: ExecutionContext;
23
+ log: ExecutionLogEntry[];
24
+ status: "completed" | "gate_blocked" | "policy_blocked" | "error" | "dry_run";
25
+ error?: Error;
26
+ blockedAt?: IntentBlock;
27
+ blockedByPolicy?: IntentBlock;
28
+ }
29
+ export interface ExecutionLogEntry {
30
+ blockId: string;
31
+ blockType: string;
32
+ content: string;
33
+ status: "skipped" | "running" | "completed" | "failed" | "blocked" | "dry_run";
34
+ input?: unknown;
35
+ output?: unknown;
36
+ error?: string;
37
+ durationMs?: number;
38
+ timestamp: string;
39
+ }
40
+ export declare function executeWorkflow(document: IntentDocument, runtime?: WorkflowRuntime): Promise<ExecutionResult>;