@dotit/core 1.1.0 → 1.2.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.
@@ -1 +1 @@
1
- export declare const DOCUMENT_CSS = "\n/* \u2500\u2500 Base \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-document{font-family:Georgia,'Times New Roman',serif;line-height:1.7;color:#111;max-width:680px;margin:0 auto;padding:32px 24px;}\n/* \u2500\u2500 Typography \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-title{font-size:1.75rem;line-height:1.2;margin:0 0 12px;font-weight:700;letter-spacing:-0.01em;}\n.intent-summary{margin:8px 0 20px;padding-block:8px;padding-inline:0;padding-inline-start:14px;border-inline-start:2px solid #999;color:#333;font-style:italic;font-size:0.95rem;}\n.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;}\n.intent-sub{margin:16px 0 6px;font-size:1rem;line-height:1.3;font-weight:600;}\n.intent-note{margin:6px 0;color:#222;}\n.intent-prose{margin:0 0 1em;color:#222;font-size:1rem;line-height:1.8;max-width:65ch;text-wrap:pretty;}\n.intent-align-center{text-align:center;}\n.intent-align-right{text-align:end;}\n.intent-align-justify{text-align:justify;}\n/* \u2500\u2500 Two-sided rows (end:) \u2014 flex start/end, RTL-native \u2500\u2500 */\n.it-split{display:flex;justify-content:space-between;align-items:baseline;gap:12px;}\n.it-split-main{min-width:0;}\n.it-split-end{flex-shrink:0;}\n/* \u2500\u2500 Divider \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-divider{margin:18px 0;text-align:center;}\n.intent-divider-line{border:none;border-top:1px solid #ccc;margin:0;}\n.intent-divider-label{display:inline-block;padding:0 10px;background:#fff;color:#888;font-size:0.78rem;position:relative;top:-9px;}\n/* \u2500\u2500 Tasks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-task{display:flex;align-items:flex-start;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}\n.intent-task-checkbox{margin-top:3px;flex-shrink:0;}\n.intent-task-text{flex:1;}\n.intent-task-meta{display:flex;gap:6px;color:#888;font-size:0.78rem;white-space:nowrap;}\n.intent-task-owner::before{content:'@ ';opacity:0.6;}\n.intent-task-due::before{content:'due ';}\n.intent-task-time::before{content:'at ';}\n.intent-task-text-done{text-decoration:line-through;color:#999;}\n/* \u2500\u2500 Ask \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-ask{display:flex;gap:10px;margin:10px 0;padding-block:6px;padding-inline:0;padding-inline-start:12px;border-inline-start:2px solid #999;align-items:baseline;}\n.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;}\n.intent-ask-content{flex:1;color:#333;font-style:italic;}\n/* \u2500\u2500 Quote \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-quote{margin:14px 0;padding-block:2px;padding-inline:0;padding-inline-start:16px;border-inline-start:2px solid #999;font-style:italic;color:#333;}\n.intent-quote p{margin:0;line-height:1.7;}\n.intent-quote-cite{display:block;margin-top:5px;font-style:normal;color:#888;font-size:0.82rem;}\n/* \u2500\u2500 Code \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-code{margin:10px 0;padding:10px 12px;background:#f5f5f5;border:1px solid #ddd;overflow-x:auto;}\n.intent-code code{font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:0.85rem;color:#111;}\n/* \u2500\u2500 Table \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-table{width:100%;border-collapse:collapse;margin:12px 0;font-size:0.9em;}\n.intent-table th,.intent-table-th{padding:6px 10px;text-align:start;font-weight:600;font-size:0.78rem;text-transform:uppercase;letter-spacing:0.04em;border-bottom:2px solid #333;}\n.intent-table td,.intent-table-td{padding:6px 10px;text-align:start;border-bottom:1px solid #ddd;vertical-align:top;}\n.intent-row:last-child .intent-table-td,.intent-row:last-child td{border-bottom:none;}\n/* \u2500\u2500 Image \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-image{margin:12px 0;}\n.intent-image-img{max-width:100%;height:auto;border:1px solid #ddd;}\n.intent-image-caption{margin-top:4px;color:#555;font-size:0.82rem;text-align:center;font-style:italic;}\n/* \u2500\u2500 Links / Refs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-link{margin:4px 0;}\n.intent-link a{color:#111;text-decoration:underline;}\n.intent-ref{margin:4px 0;}\n.intent-ref a{color:#111;text-decoration:underline;font-style:italic;}\n.intent-unknown{margin:6px 0;padding:6px 10px;border:1px dashed #ccc;color:#888;}\n/* \u2500\u2500 Embed \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-embed{margin:14px 0;}\n.intent-embed iframe,.intent-embed video,.intent-embed audio{display:block;width:100%;border:1px solid #ddd;}\n/* \u2500\u2500 Callouts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-callout{display:flex;gap:10px;margin:10px 0;padding-block:6px;padding-inline:0;padding-inline-start:12px;border-inline-start:2px solid #888;align-items:baseline;}\n.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;}\n.intent-callout-content{flex:1;color:#222;}\n.intent-info{border-color:#888;}\n.intent-info .intent-callout-label{color:#444;}\n.intent-warning{border-color:#888;}\n.intent-warning .intent-callout-label{color:#444;}\n.intent-tip{border-color:#888;}\n.intent-tip .intent-callout-label{color:#444;}\n.intent-success{border-color:#888;}\n.intent-success .intent-callout-label{color:#444;}\n/* \u2500\u2500 Inline formatting \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-inline-link{color:#111;text-decoration:underline;}\n.intent-inline-highlight{background:#eee;padding:0 .15em;}\n.intent-inline-note{display:inline-block;padding:0 .3em;border:1px solid #ddd;color:#333;font-size:.92em;}\n.intent-inline-quote{color:#333;font-style:italic;}\n.intent-inline-date{font-weight:600;font-family:'SFMono-Regular',Consolas,monospace;}\n.intent-inline-mention{font-weight:600;}\n.intent-inline-tag{font-weight:600;}\n/* \u2500\u2500 Lists \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nul,ol{margin:6px 0 6px 20px;padding:0;}\nli{margin:3px 0;color:#222;}\n/* \u2500\u2500 v2 Agentic Workflow Blocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-step{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}\n.intent-step-icon{font-size:0.85rem;flex-shrink:0;}\n.intent-step-content{flex:1;font-weight:500;}\n.intent-step-meta{display:flex;gap:5px;align-items:center;flex-wrap:wrap;}\n.intent-step-id{font-size:0.72rem;color:#888;font-family:monospace;}\n.intent-step-depends{font-size:0.75rem;color:#555;font-style:italic;}\n.intent-badge{font-size:0.7rem;padding:1px 6px;border:1px solid #bbb;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;}\n.intent-badge-tool{border-color:#999;}\n.intent-status-pending{color:#666;}\n.intent-status-running{color:#333;animation:intent-pulse 1.5s ease-in-out infinite;}\n.intent-status-blocked{color:#666;}\n.intent-status-failed{color:#333;text-decoration:line-through;}\n.intent-status-done{color:#333;}\n.intent-status-skipped,.intent-status-cancelled{color:#999;text-decoration:line-through;}\n@keyframes intent-pulse{0%,100%{opacity:1;}50%{opacity:0.4;}}\n.intent-decision{display:flex;gap:10px;margin:8px 0;padding:8px 12px;border:1px solid #bbb;}\n.intent-decision-diamond{width:16px;height:16px;border:2px solid #333;transform:rotate(45deg);flex-shrink:0;margin-top:4px;}\n.intent-decision-body{flex:1;}\n.intent-decision-label{font-weight:600;margin-bottom:3px;}\n.intent-decision-condition{font-size:0.85rem;color:#444;font-family:monospace;margin-bottom:3px;}\n.intent-decision-branches{display:flex;gap:14px;font-size:0.82rem;}\n.intent-decision-then{color:#333;}\n.intent-decision-else{color:#333;}\n.intent-trigger{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}\n.intent-trigger-icon{font-size:1rem;}\n.intent-trigger-content{flex:1;font-weight:500;}\n.intent-badge-event{border-color:#999;}\n.intent-loop{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}\n.intent-loop-icon{font-size:1rem;}\n.intent-loop-content{flex:1;font-weight:500;}\n.intent-loop-over,.intent-loop-do{font-size:0.8rem;color:#555;font-family:monospace;}\n.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;}\n.intent-checkpoint-flag{font-size:1rem;}\n.intent-checkpoint-label{flex-shrink:0;}\n.intent-checkpoint-line{flex:1;border:none;border-top:1px dashed #bbb;margin:0;}\n.intent-audit{margin:4px 0;padding:4px 8px;font-family:'SFMono-Regular',Consolas,monospace;font-size:0.8rem;color:#555;border-inline-start:2px solid #bbb;}\n.intent-audit-prefix{color:#888;font-weight:600;}\n.intent-error-block{border-color:#999;}\n.intent-error-block .intent-callout-label{color:#333;}\n.intent-error-fallback{font-size:0.8rem;color:#555;font-style:italic;margin-inline-start:6px;}\n.intent-error-notify{font-size:0.8rem;color:#555;margin-inline-start:6px;}\n.intent-context-table{width:auto;border-collapse:collapse;margin:6px 0;font-size:0.85rem;}\n.intent-context-key{padding:3px 10px 3px 8px;font-weight:600;color:#333;font-family:monospace;border-bottom:1px solid #ddd;}\n.intent-context-val{padding:3px 12px 3px 6px;color:#333;font-family:monospace;border-bottom:1px solid #ddd;}\n.intent-context{margin:4px 0;font-size:0.85rem;color:#333;}\n.intent-progress{display:flex;align-items:center;gap:8px;margin:6px 0;}\n.intent-progress-label{font-size:0.85rem;color:#222;flex-shrink:0;}\n.intent-progress-bar{flex:1;height:6px;background:#ddd;overflow:hidden;}\n.intent-progress-fill{height:100%;background:#555;}\n.intent-progress-pct{font-size:0.78rem;color:#555;font-weight:600;min-width:36px;text-align:end;}\n.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;}\n.intent-file-ref-icon{font-size:0.9rem;}\n/* \u2500\u2500 v2.1 Agentic Workflow Blocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-emit-block{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;}\n.intent-emit-icon{font-size:1rem;}\n.intent-emit-content{flex:1;font-weight:500;}\n.intent-emit-meta{display:flex;gap:5px;align-items:center;}\n.intent-emit-phase{font-size:0.78rem;color:#555;font-weight:600;}\n.intent-badge-level{border-color:#999;}\n.intent-result{display:flex;align-items:flex-start;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;flex-wrap:wrap;}\n.intent-result-success{border-color:#999;}\n.intent-result-error,.intent-result-failure{border-color:#999;}\n.intent-result-icon{font-size:1rem;flex-shrink:0;}\n.intent-result-content{flex:1;font-weight:500;}\n.intent-badge-code{border-color:#999;font-family:monospace;}\n.intent-result-data{width:100%;margin-top:3px;padding:4px 8px;font-size:0.82rem;overflow-x:auto;border-top:1px solid #ddd;}\n.intent-result-data code{font-family:'SFMono-Regular',Consolas,monospace;font-size:0.82rem;color:#333;}\n.intent-handoff{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;}\n.intent-handoff-icon{font-size:1rem;}\n.intent-handoff-content{flex:1;font-weight:500;}\n.intent-handoff-arrow{display:flex;align-items:center;gap:5px;font-size:0.82rem;color:#444;font-weight:600;}\n.intent-handoff-agent{padding:1px 5px;border:1px solid #bbb;font-family:monospace;font-size:0.78rem;}\n.intent-wait{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;border-inline-start:2px solid #999;}\n.intent-wait-icon{font-size:1rem;animation:intent-pulse 2s ease-in-out infinite;}\n.intent-wait-content{flex:1;font-weight:500;color:#333;}\n.intent-wait-meta{display:flex;gap:5px;align-items:center;}\n.intent-badge-timeout{border-color:#999;font-family:monospace;}\n.intent-wait-fallback{font-size:0.8rem;color:#555;font-style:italic;}\n.intent-parallel{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;}\n.intent-parallel-icon{font-size:1rem;}\n.intent-parallel-content{flex:1;font-weight:500;}\n.intent-parallel-steps{display:flex;gap:4px;flex-wrap:wrap;}\n.intent-badge-parallel-step{border-color:#999;font-family:monospace;font-size:0.72rem;padding:1px 5px;}\n.intent-badge-join{border-color:#999;font-size:0.72rem;padding:1px 5px;}\n.intent-retry{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;}\n.intent-retry-icon{font-size:1rem;}\n.intent-retry-content{flex:1;font-weight:500;}\n.intent-retry-meta{display:flex;gap:5px;align-items:center;}\n.intent-badge-retry-max{border-color:#999;font-size:0.72rem;}\n.intent-badge-retry-delay{border-color:#999;font-size:0.72rem;font-family:monospace;}\n.intent-badge-retry-backoff{border-color:#999;font-size:0.72rem;font-style:italic;}\n/* \u2500\u2500 v2.2 Agentic Workflow Blocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-gate{display:flex;gap:10px;margin:8px 0;padding:10px 12px;border:2px solid #888;}\n.intent-gate-icon{font-size:1.2rem;flex-shrink:0;margin-top:2px;}\n.intent-gate-body{flex:1;}\n.intent-gate-label{font-weight:600;margin-bottom:3px;}\n.intent-gate-meta{display:flex;gap:5px;align-items:center;flex-wrap:wrap;}\n.intent-badge-approver{border-color:#999;font-family:monospace;}\n.intent-gate-fallback{font-size:0.8rem;color:#555;font-style:italic;}\n.intent-call{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px dashed #999;margin:5px 0;}\n.intent-call-icon{font-size:1rem;}\n.intent-call-content{flex:1;font-weight:500;font-family:monospace;font-size:0.9rem;}\n.intent-call-meta{display:flex;gap:6px;align-items:center;}\n.intent-call-input{font-size:0.78rem;color:#555;font-family:monospace;}\n.intent-call-output{font-size:0.78rem;color:#555;font-family:monospace;}\n/* \u2500\u2500 v2.5 Document Generation Blocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.it-page-break{page-break-after:always;break-after:page;height:0;}\n.it-byline{margin:0 0 16px;font-size:0.9em;color:#333;}\n.it-byline-author{display:block;font-weight:bold;}\n.it-byline-meta{display:block;font-size:0.85em;color:#666;margin-top:2px;}\n.it-epigraph{font-style:italic;text-align:center;margin:20px 3em;border:none;padding:0;}\n.it-epigraph p{margin:0;}\n.it-epigraph .it-epigraph-by{display:block;text-align:end;font-size:0.9em;margin-top:4px;font-style:normal;color:#666;}\n.it-caption{font-size:0.85em;font-style:italic;text-align:center;color:#444;margin-top:3px;margin-bottom:10px;}\n.it-dedication{font-style:italic;text-align:center;margin:3em auto;}\n.it-toc{margin:20px 0;}\n.it-toc-title{font-size:1.1rem;font-weight:600;margin-bottom:8px;border:none;}\n.it-toc ol{list-style:none;padding:0;margin:0;}\n.it-toc li{margin:3px 0;}\n.it-toc li a{color:#111;text-decoration:none;border-bottom:1px dotted #bbb;}\n.it-toc li a:hover{border-bottom-style:solid;}\n.it-toc .it-toc-sub{padding-inline-start:20px;font-size:0.92em;}\n.it-footnotes{border-top:1px solid #ccc;margin-top:24px;padding-top:8px;font-size:0.85em;color:#444;}\n.it-footnotes ol{padding-inline-start:1.5em;margin:0;}\n.it-footnotes li{margin:3px 0;}\nsup.it-fn-ref{font-size:0.7em;vertical-align:super;}\nsup.it-fn-ref a{color:#111;text-decoration:none;border-bottom:1px solid #999;}\n/* \u2500\u2500 v2.8 Document Trust \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.it-approval{display:flex;gap:10px;margin:10px 0;padding:10px 14px;border:1px solid #4caf50;background:#f8fdf8;}\n.it-approval__icon{font-size:1.2rem;color:#4caf50;flex-shrink:0;}\n.it-approval__body{display:flex;flex-direction:column;gap:2px;}\n.it-approval__label{font-size:0.72rem;font-weight:700;text-transform:uppercase;letter-spacing:0.08em;color:#4caf50;}\n.it-approval__who{font-size:0.9rem;color:#222;}\n.it-approval__date{font-size:0.8rem;color:#666;}\n.it-signature{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:10px 0;padding:10px 14px;border:1px solid #daa520;background:#fffdf5;}\n.it-signature--valid{border-color:#4caf50;background:#f8fdf8;}\n.it-signature--invalid{border-color:#c62828;background:#fdf5f5;}\n.it-signature__name{font-weight:600;font-size:0.95rem;color:#111;}\n.it-signature__role{font-size:0.85rem;color:#555;}\n.it-signature__date{font-size:0.8rem;color:#666;}\n.it-signature__status{font-size:0.8rem;font-weight:600;margin-inline-start:auto;}\n.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;}\n.it-sealed-banner__icon{font-size:1.3rem;}\n.it-sealed-banner__text{font-size:1rem;color:#c62828;text-transform:uppercase;letter-spacing:0.04em;}\n.it-sealed-banner__date{font-size:0.8rem;color:#666;margin-inline-start:auto;}\n.it-sealed-banner__hash{font-size:0.72rem;color:#888;font-family:monospace;}\n/* \u2500\u2500 v2.11 Keyword Expansion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.it-ref-card{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}\n.it-ref-icon{font-size:1rem;flex-shrink:0;}\n.it-ref-link{color:#111;text-decoration:underline;font-weight:500;}\n.it-ref-name{font-weight:500;}\n.it-ref-rel{font-size:0.7rem;padding:1px 6px;border:1px solid #bbb;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;}\n.it-def{margin:6px 0;padding:4px 0;}\n.it-def-term{font-weight:700;font-size:0.95rem;color:#111;}\n.it-def-abbr{font-weight:400;color:#555;}\n.it-def-meaning{margin:2px 0 0 0;color:#333;font-size:0.92rem;padding-inline-start:1em;}\n.it-metric{display:inline-block;padding:10px 14px;border:1px solid #ddd;margin:5px;min-width:140px;vertical-align:top;}\n.it-metric-name{font-size:0.78rem;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;color:#555;}\n.it-metric-value{font-size:1.6rem;font-weight:700;line-height:1.2;color:#111;}\n.it-metric-unit{font-size:0.85rem;font-weight:400;color:#666;margin-inline-start:2px;}\n.it-metric-target{font-size:0.78rem;color:#888;}\n.it-metric-trend{font-size:1rem;font-weight:700;margin-top:2px;}\n.it-metric-period{font-size:0.72rem;color:#888;}\n.it-metric-green{border-color:#4caf50;}\n.it-metric-green .it-metric-value{color:#2e7d32;}\n.it-metric-red{border-color:#c62828;}\n.it-metric-red .it-metric-value{color:#c62828;}\n.it-metric-neutral{border-color:#ddd;}\n/* Document total/line rows (invoice, receipt, statement) \u2014 matches the editor's\n itMetric node so editor-designed templates print identically. */\n.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);}\n.it-metric-row__label{color:var(--it-color-muted,#555);}\n.it-metric-row__value{font-variant-numeric:tabular-nums;font-weight:600;color:var(--it-color-text,#111);white-space:nowrap;}\n.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;}\n.it-metric-row--total .it-metric-row__label{color:var(--it-color-text,#111);font-weight:600;}\n.it-amendment{margin:10px 0;padding:10px 14px;border:2px solid #e65100;background:#fff8e1;}\n.it-amendment-header{display:flex;align-items:center;gap:8px;margin-bottom:6px;}\n.it-amendment-icon{font-size:1rem;}\n.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;}\n.it-amendment-title{font-weight:600;color:#111;}\n.it-amendment-section{font-size:0.85rem;color:#555;font-style:italic;}\n.it-amendment-was{font-size:0.85rem;color:#c62828;text-decoration:line-through;}\n.it-amendment-now{font-size:0.85rem;color:#2e7d32;font-weight:500;}\n.it-amendment-meta{display:flex;gap:8px;margin-top:4px;font-size:0.8rem;color:#666;}\n.it-figure{margin:14px 0;}\n.it-figure img{display:block;margin:0 auto;border:1px solid #ddd;}\n.it-figure-caption{font-size:0.85em;font-style:italic;text-align:center;color:#444;margin-top:6px;}\n.it-signline{margin:20px 0;padding:0;}\n.it-signline-label{font-size:0.72rem;color:#888;text-transform:uppercase;letter-spacing:0.06em;margin-bottom:4px;}\n.it-signline-rule{border-bottom:1px solid #111;margin-bottom:4px;}\n.it-signline-name{font-size:0.9rem;font-weight:500;color:#111;}\n.it-signline-role{font-size:0.82rem;color:#555;}\n.it-signline-date{font-size:0.82rem;color:#555;margin-top:4px;}\n.it-contact{padding:8px 12px;border:1px solid #ddd;margin:5px 0;}\n.it-contact-name{font-weight:600;font-size:0.95rem;color:#111;}\n.it-contact-role{font-size:0.82rem;color:#555;}\n.it-contact-org{font-size:0.82rem;color:#555;}\n.it-contact-email a,.it-contact-phone a,.it-contact-url a{color:#111;text-decoration:underline;font-size:0.85rem;}\n.it-deadline{padding:8px 12px;border-inline-start:3px solid #4caf50;margin:5px 0;}\n.it-deadline-name{font-weight:600;color:#111;}\n.it-deadline-date{font-size:0.9rem;font-weight:600;color:#111;}\n.it-deadline-consequence{font-size:0.85rem;color:#555;font-style:italic;}\n.it-deadline-owner{font-size:0.82rem;color:#555;}\n.it-deadline-authority{font-size:0.82rem;color:#555;}\n.it-deadline-green{border-color:#4caf50;}\n.it-deadline-amber{border-color:#f57c00;}\n.it-deadline-red{border-color:#c62828;}\n";
1
+ export declare const DOCUMENT_CSS = "\n/* \u2500\u2500 Base \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-document{font-family:Georgia,'Times New Roman',serif;line-height:1.7;color:#111;max-width:680px;margin:0 auto;padding:32px 24px;}\n/* \u2500\u2500 Typography \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-title{font-size:1.75rem;line-height:1.2;margin:0 0 12px;font-weight:700;letter-spacing:-0.01em;}\n.intent-summary{margin:8px 0 20px;padding-block:8px;padding-inline:0;padding-inline-start:14px;border-inline-start:2px solid #999;color:#333;font-style:italic;font-size:0.95rem;}\n.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;}\n.intent-sub{margin:16px 0 6px;font-size:1rem;line-height:1.3;font-weight:600;}\n.intent-note{margin:6px 0;color:#222;}\n.intent-prose{margin:0 0 1em;color:#222;font-size:1rem;line-height:1.8;max-width:65ch;text-wrap:pretty;}\n.intent-align-center{text-align:center;}\n.intent-align-right{text-align:end;}\n.intent-align-justify{text-align:justify;}\n/* \u2500\u2500 Two-sided rows (end:) \u2014 flex start/end, RTL-native \u2500\u2500 */\n.it-split{display:flex;justify-content:space-between;align-items:baseline;gap:12px;}\n.it-split-main{min-width:0;}\n.it-split-end{flex-shrink:0;}\n/* \u2500\u2500 Divider \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-divider{margin:18px 0;text-align:center;}\n.intent-divider-line{border:none;border-top:1px solid #ccc;margin:0;}\n.intent-divider-label{display:inline-block;padding:0 10px;background:#fff;color:#888;font-size:0.78rem;position:relative;top:-9px;}\n/* \u2500\u2500 Tasks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-task{display:flex;align-items:flex-start;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}\n.intent-task-checkbox{margin-top:3px;flex-shrink:0;}\n.intent-task-text{flex:1;}\n.intent-task-meta{display:flex;gap:6px;color:#888;font-size:0.78rem;white-space:nowrap;}\n.intent-task-owner::before{content:'@ ';opacity:0.6;}\n.intent-task-due::before{content:'due ';}\n.intent-task-time::before{content:'at ';}\n.intent-task-text-done{text-decoration:line-through;color:#999;}\n/* \u2500\u2500 Ask \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-ask{display:flex;gap:10px;margin:10px 0;padding-block:6px;padding-inline:0;padding-inline-start:12px;border-inline-start:2px solid #999;align-items:baseline;}\n.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;}\n.intent-ask-content{flex:1;color:#333;font-style:italic;}\n/* \u2500\u2500 Quote \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-quote{margin:14px 0;padding-block:2px;padding-inline:0;padding-inline-start:16px;border-inline-start:2px solid #999;font-style:italic;color:#333;}\n.intent-quote p{margin:0;line-height:1.7;}\n.intent-quote-cite{display:block;margin-top:5px;font-style:normal;color:#888;font-size:0.82rem;}\n/* \u2500\u2500 Code \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-code{margin:10px 0;padding:10px 12px;background:#f5f5f5;border:1px solid #ddd;overflow-x:auto;}\n.intent-code code{font-family:'SFMono-Regular',Consolas,'Liberation Mono',Menlo,monospace;font-size:0.85rem;color:#111;}\n/* \u2500\u2500 Table \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-table{width:100%;border-collapse:collapse;margin:12px 0;font-size:0.9em;}\n.intent-table th,.intent-table-th{padding:6px 10px;text-align:start;font-weight:600;font-size:0.78rem;text-transform:uppercase;letter-spacing:0.04em;border-bottom:2px solid #333;}\n.intent-table td,.intent-table-td{padding:6px 10px;text-align:start;border-bottom:1px solid #ddd;vertical-align:top;}\n.intent-row:last-child .intent-table-td,.intent-row:last-child td{border-bottom:none;}\n/* \u2500\u2500 Image \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-image{margin:12px 0;}\n.intent-image-img{max-width:100%;height:auto;border:1px solid #ddd;}\n.intent-image-caption{margin-top:4px;color:#555;font-size:0.82rem;text-align:center;font-style:italic;}\n/* \u2500\u2500 Links / Refs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-link{margin:4px 0;}\n.intent-link a{color:#111;text-decoration:underline;}\n.intent-ref{margin:4px 0;}\n.intent-ref a{color:#111;text-decoration:underline;font-style:italic;}\n.intent-unknown{margin:6px 0;padding:6px 10px;border:1px dashed #ccc;color:#888;}\n/* \u2500\u2500 Embed \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-embed{margin:14px 0;}\n.intent-embed iframe,.intent-embed video,.intent-embed audio{display:block;width:100%;border:1px solid #ddd;}\n/* \u2500\u2500 Callouts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-callout{display:flex;gap:10px;margin:10px 0;padding-block:6px;padding-inline:0;padding-inline-start:12px;border-inline-start:2px solid #888;align-items:baseline;}\n.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;}\n.intent-callout-content{flex:1;color:#222;}\n/* Info is the quiet variant: a soft gray panel with an \u24D8 marker and italic\n text \u2014 \"this is worth noting\", not an alarm. */\n.intent-info{background:#f5f6f8;border-inline-start:3px solid #c7ccd3;border-radius:0 3px 3px 0;padding-block:8px;padding-inline-start:12px;padding-inline-end:14px;}\n.intent-info .intent-callout-label{display:none;}\n.intent-info .intent-callout-content{font-style:italic;color:#4f4f4f;}\n.intent-info .intent-callout-content::before{content:\"\u24D8 \";font-style:normal;font-weight:600;color:#6e6e6e;}\n.intent-warning{border-color:#888;}\n.intent-warning .intent-callout-label{color:#444;}\n.intent-tip{border-color:#888;}\n.intent-tip .intent-callout-label{color:#444;}\n.intent-success{border-color:#888;}\n.intent-success .intent-callout-label{color:#444;}\n/* \u2500\u2500 Inline formatting \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-inline-link{color:#111;text-decoration:underline;}\n.intent-inline-highlight{background:#eee;padding:0 .15em;}\n.intent-inline-note{display:inline-block;padding:0 .3em;border:1px solid #ddd;color:#333;font-size:.92em;}\n.intent-inline-quote{color:#333;font-style:italic;}\n.intent-inline-date{font-weight:600;font-family:'SFMono-Regular',Consolas,monospace;}\n.intent-inline-mention{font-weight:600;}\n.intent-inline-tag{font-weight:600;}\n/* \u2500\u2500 Lists \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nul,ol{margin:6px 0 6px 20px;padding:0;}\nli{margin:3px 0;color:#222;}\n/* \u2500\u2500 v2 Agentic Workflow Blocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-step{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}\n.intent-step-icon{font-size:0.85rem;flex-shrink:0;}\n.intent-step-content{flex:1;font-weight:500;}\n.intent-step-meta{display:flex;gap:5px;align-items:center;flex-wrap:wrap;}\n.intent-step-id{font-size:0.72rem;color:#888;font-family:monospace;}\n.intent-step-depends{font-size:0.75rem;color:#555;font-style:italic;}\n.intent-badge{font-size:0.7rem;padding:1px 6px;border:1px solid #bbb;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;}\n.intent-badge-tool{border-color:#999;}\n.intent-status-pending{color:#666;}\n.intent-status-running{color:#333;animation:intent-pulse 1.5s ease-in-out infinite;}\n.intent-status-blocked{color:#666;}\n.intent-status-failed{color:#333;text-decoration:line-through;}\n.intent-status-done{color:#333;}\n.intent-status-skipped,.intent-status-cancelled{color:#999;text-decoration:line-through;}\n@keyframes intent-pulse{0%,100%{opacity:1;}50%{opacity:0.4;}}\n.intent-decision{display:flex;gap:10px;margin:8px 0;padding:8px 12px;border:1px solid #bbb;}\n.intent-decision-diamond{width:16px;height:16px;border:2px solid #333;transform:rotate(45deg);flex-shrink:0;margin-top:4px;}\n.intent-decision-body{flex:1;}\n.intent-decision-label{font-weight:600;margin-bottom:3px;}\n.intent-decision-condition{font-size:0.85rem;color:#444;font-family:monospace;margin-bottom:3px;}\n.intent-decision-branches{display:flex;gap:14px;font-size:0.82rem;}\n.intent-decision-then{color:#333;}\n.intent-decision-else{color:#333;}\n.intent-trigger{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}\n.intent-trigger-icon{font-size:1rem;}\n.intent-trigger-content{flex:1;font-weight:500;}\n.intent-badge-event{border-color:#999;}\n.intent-loop{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}\n.intent-loop-icon{font-size:1rem;}\n.intent-loop-content{flex:1;font-weight:500;}\n.intent-loop-over,.intent-loop-do{font-size:0.8rem;color:#555;font-family:monospace;}\n.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;}\n.intent-checkpoint-flag{font-size:1rem;}\n.intent-checkpoint-label{flex-shrink:0;}\n.intent-checkpoint-line{flex:1;border:none;border-top:1px dashed #bbb;margin:0;}\n.intent-audit{margin:4px 0;padding:4px 8px;font-family:'SFMono-Regular',Consolas,monospace;font-size:0.8rem;color:#555;border-inline-start:2px solid #bbb;}\n.intent-audit-prefix{color:#888;font-weight:600;}\n.intent-error-block{border-color:#999;}\n.intent-error-block .intent-callout-label{color:#333;}\n.intent-error-fallback{font-size:0.8rem;color:#555;font-style:italic;margin-inline-start:6px;}\n.intent-error-notify{font-size:0.8rem;color:#555;margin-inline-start:6px;}\n.intent-context-table{width:auto;border-collapse:collapse;margin:6px 0;font-size:0.85rem;}\n.intent-context-key{padding:3px 10px 3px 8px;font-weight:600;color:#333;font-family:monospace;border-bottom:1px solid #ddd;}\n.intent-context-val{padding:3px 12px 3px 6px;color:#333;font-family:monospace;border-bottom:1px solid #ddd;}\n.intent-context{margin:4px 0;font-size:0.85rem;color:#333;}\n.intent-progress{display:flex;align-items:center;gap:8px;margin:6px 0;}\n.intent-progress-label{font-size:0.85rem;color:#222;flex-shrink:0;}\n.intent-progress-bar{flex:1;height:6px;background:#ddd;overflow:hidden;}\n.intent-progress-fill{height:100%;background:#555;}\n.intent-progress-pct{font-size:0.78rem;color:#555;font-weight:600;min-width:36px;text-align:end;}\n.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;}\n.intent-file-ref-icon{font-size:0.9rem;}\n/* \u2500\u2500 v2.1 Agentic Workflow Blocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-emit-block{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;}\n.intent-emit-icon{font-size:1rem;}\n.intent-emit-content{flex:1;font-weight:500;}\n.intent-emit-meta{display:flex;gap:5px;align-items:center;}\n.intent-emit-phase{font-size:0.78rem;color:#555;font-weight:600;}\n.intent-badge-level{border-color:#999;}\n.intent-result{display:flex;align-items:flex-start;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;flex-wrap:wrap;}\n.intent-result-success{border-color:#999;}\n.intent-result-error,.intent-result-failure{border-color:#999;}\n.intent-result-icon{font-size:1rem;flex-shrink:0;}\n.intent-result-content{flex:1;font-weight:500;}\n.intent-badge-code{border-color:#999;font-family:monospace;}\n.intent-result-data{width:100%;margin-top:3px;padding:4px 8px;font-size:0.82rem;overflow-x:auto;border-top:1px solid #ddd;}\n.intent-result-data code{font-family:'SFMono-Regular',Consolas,monospace;font-size:0.82rem;color:#333;}\n.intent-handoff{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;}\n.intent-handoff-icon{font-size:1rem;}\n.intent-handoff-content{flex:1;font-weight:500;}\n.intent-handoff-arrow{display:flex;align-items:center;gap:5px;font-size:0.82rem;color:#444;font-weight:600;}\n.intent-handoff-agent{padding:1px 5px;border:1px solid #bbb;font-family:monospace;font-size:0.78rem;}\n.intent-wait{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;border-inline-start:2px solid #999;}\n.intent-wait-icon{font-size:1rem;animation:intent-pulse 2s ease-in-out infinite;}\n.intent-wait-content{flex:1;font-weight:500;color:#333;}\n.intent-wait-meta{display:flex;gap:5px;align-items:center;}\n.intent-badge-timeout{border-color:#999;font-family:monospace;}\n.intent-wait-fallback{font-size:0.8rem;color:#555;font-style:italic;}\n.intent-parallel{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;}\n.intent-parallel-icon{font-size:1rem;}\n.intent-parallel-content{flex:1;font-weight:500;}\n.intent-parallel-steps{display:flex;gap:4px;flex-wrap:wrap;}\n.intent-badge-parallel-step{border-color:#999;font-family:monospace;font-size:0.72rem;padding:1px 5px;}\n.intent-badge-join{border-color:#999;font-size:0.72rem;padding:1px 5px;}\n.intent-retry{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #bbb;margin:5px 0;}\n.intent-retry-icon{font-size:1rem;}\n.intent-retry-content{flex:1;font-weight:500;}\n.intent-retry-meta{display:flex;gap:5px;align-items:center;}\n.intent-badge-retry-max{border-color:#999;font-size:0.72rem;}\n.intent-badge-retry-delay{border-color:#999;font-size:0.72rem;font-family:monospace;}\n.intent-badge-retry-backoff{border-color:#999;font-size:0.72rem;font-style:italic;}\n/* \u2500\u2500 v2.2 Agentic Workflow Blocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.intent-gate{display:flex;gap:10px;margin:8px 0;padding:10px 12px;border:2px solid #888;}\n.intent-gate-icon{font-size:1.2rem;flex-shrink:0;margin-top:2px;}\n.intent-gate-body{flex:1;}\n.intent-gate-label{font-weight:600;margin-bottom:3px;}\n.intent-gate-meta{display:flex;gap:5px;align-items:center;flex-wrap:wrap;}\n.intent-badge-approver{border-color:#999;font-family:monospace;}\n.intent-gate-fallback{font-size:0.8rem;color:#555;font-style:italic;}\n.intent-call{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px dashed #999;margin:5px 0;}\n.intent-call-icon{font-size:1rem;}\n.intent-call-content{flex:1;font-weight:500;font-family:monospace;font-size:0.9rem;}\n.intent-call-meta{display:flex;gap:6px;align-items:center;}\n.intent-call-input{font-size:0.78rem;color:#555;font-family:monospace;}\n.intent-call-output{font-size:0.78rem;color:#555;font-family:monospace;}\n/* \u2500\u2500 v2.5 Document Generation Blocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.it-page-break{page-break-after:always;break-after:page;height:0;}\n.it-byline{margin:0 0 16px;font-size:0.9em;color:#333;}\n.it-byline-author{display:block;font-weight:bold;}\n.it-byline-meta{display:block;font-size:0.85em;color:#666;margin-top:2px;}\n.it-epigraph{font-style:italic;text-align:center;margin:20px 3em;border:none;padding:0;}\n.it-epigraph p{margin:0;}\n.it-epigraph .it-epigraph-by{display:block;text-align:end;font-size:0.9em;margin-top:4px;font-style:normal;color:#666;}\n.it-caption{font-size:0.85em;font-style:italic;text-align:center;color:#444;margin-top:3px;margin-bottom:10px;}\n.it-dedication{font-style:italic;text-align:center;margin:3em auto;}\n.it-toc{margin:20px 0;}\n.it-toc-title{font-size:1.1rem;font-weight:600;margin-bottom:8px;border:none;}\n.it-toc ol{list-style:none;padding:0;margin:0;}\n.it-toc li{margin:3px 0;}\n.it-toc li a{color:#111;text-decoration:none;border-bottom:1px dotted #bbb;}\n.it-toc li a:hover{border-bottom-style:solid;}\n.it-toc .it-toc-sub{padding-inline-start:20px;font-size:0.92em;}\n.it-footnotes{border-top:1px solid #ccc;margin-top:24px;padding-top:8px;font-size:0.85em;color:#444;}\n.it-footnotes ol{padding-inline-start:1.5em;margin:0;}\n.it-footnotes li{margin:3px 0;}\nsup.it-fn-ref{font-size:0.7em;vertical-align:super;}\nsup.it-fn-ref a{color:#111;text-decoration:none;border-bottom:1px solid #999;}\n/* \u2500\u2500 v2.8 Document Trust \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n/* Trust blocks are typeset like entries in a legal document \u2014 hairlines and\n small-caps labels, no colored fills (ink-first; prints exactly as shown). */\n.it-approval{display:flex;flex-wrap:wrap;gap:10px;align-items:baseline;margin:12px 0;padding:7px 2px;border-bottom:1px solid #ddd;}\n.it-approval__icon{display:none;}\n.it-approval__body{display:contents;}\n.it-approval__label{font-size:0.7rem;font-weight:700;text-transform:uppercase;letter-spacing:0.1em;color:#2e7d32;flex-shrink:0;}\n.it-approval__label::before{content:'\u2713 ';}\n.it-approval__what{font-size:0.9rem;font-weight:600;color:#111;}\n.it-approval__who{font-size:0.9rem;color:#555;}\n.it-approval__date{font-size:0.8rem;color:#777;margin-inline-start:auto;font-variant-numeric:tabular-nums;}\n.it-signature{display:flex;flex-wrap:wrap;gap:10px;align-items:baseline;margin:14px 0 10px;padding:7px 2px 5px;border-top:1px solid #111;}\n.it-signature--valid{border-top-color:#111;}\n.it-signature--invalid{border-top-color:#c62828;}\n.it-signature__name{font-weight:600;font-size:0.95rem;color:#111;}\n.it-signature__role{font-size:0.85rem;color:#555;}\n.it-signature__date{font-size:0.8rem;color:#777;font-variant-numeric:tabular-nums;}\n.it-signature__status{font-size:0.72rem;font-weight:600;margin-inline-start:auto;text-transform:uppercase;letter-spacing:0.08em;color:#2e7d32;}\n.it-signature--invalid .it-signature__status{color:#c62828;}\n.it-sealed-banner{display:flex;flex-wrap:wrap;gap:12px;align-items:baseline;margin:18px 0;padding:8px 2px;border-top:1px solid #111;border-bottom:1px solid #111;}\n.it-sealed-banner__icon{display:none;}\n.it-sealed-banner__text{font-size:0.78rem;font-weight:700;color:#111;text-transform:uppercase;letter-spacing:0.14em;}\n.it-sealed-banner__date{font-size:0.8rem;color:#666;margin-inline-start:auto;font-variant-numeric:tabular-nums;}\n.it-sealed-banner__hash{font-size:0.72rem;color:#999;font-family:'SFMono-Regular',Consolas,monospace;}\n/* \u2500\u2500 v2.11 Keyword Expansion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.it-ref-card{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}\n.it-ref-icon{font-size:1rem;flex-shrink:0;}\n.it-ref-link{color:#111;text-decoration:underline;font-weight:500;}\n.it-ref-name{font-weight:500;}\n.it-ref-rel{font-size:0.7rem;padding:1px 6px;border:1px solid #bbb;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;}\n.it-def{margin:6px 0;padding:4px 0;}\n.it-def-term{font-weight:700;font-size:0.95rem;color:#111;}\n.it-def-abbr{font-weight:400;color:#555;}\n.it-def-meaning{margin:2px 0 0 0;color:#333;font-size:0.92rem;padding-inline-start:1em;}\n.it-metric{display:inline-block;padding:10px 14px;border:1px solid #ddd;margin:5px;min-width:140px;vertical-align:top;}\n.it-metric-name{font-size:0.78rem;font-weight:600;text-transform:uppercase;letter-spacing:0.04em;color:#555;}\n.it-metric-value{font-size:1.6rem;font-weight:700;line-height:1.2;color:#111;}\n.it-metric-unit{font-size:0.85rem;font-weight:400;color:#666;margin-inline-start:2px;}\n.it-metric-target{font-size:0.78rem;color:#888;}\n.it-metric-trend{font-size:1rem;font-weight:700;margin-top:2px;}\n.it-metric-period{font-size:0.72rem;color:#888;}\n.it-metric-green{border-color:#4caf50;}\n.it-metric-green .it-metric-value{color:#2e7d32;}\n.it-metric-red{border-color:#c62828;}\n.it-metric-red .it-metric-value{color:#c62828;}\n.it-metric-neutral{border-color:#ddd;}\n/* Document total/line rows (invoice, receipt, statement) \u2014 matches the editor's\n itMetric node so editor-designed templates print identically. */\n.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);}\n.it-metric-row__label{color:var(--it-color-muted,#555);}\n.it-metric-row__value{font-variant-numeric:tabular-nums;font-weight:600;color:var(--it-color-text,#111);white-space:nowrap;}\n.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;}\n.it-metric-row--total .it-metric-row__label{color:var(--it-color-text,#111);font-weight:600;}\n.it-amendment{margin:10px 0;padding:10px 14px;border:2px solid #e65100;background:#fff8e1;}\n.it-amendment-header{display:flex;align-items:center;gap:8px;margin-bottom:6px;}\n.it-amendment-icon{font-size:1rem;}\n.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;}\n.it-amendment-title{font-weight:600;color:#111;}\n.it-amendment-section{font-size:0.85rem;color:#555;font-style:italic;}\n.it-amendment-was{font-size:0.85rem;color:#c62828;text-decoration:line-through;}\n.it-amendment-now{font-size:0.85rem;color:#2e7d32;font-weight:500;}\n.it-amendment-meta{display:flex;gap:8px;margin-top:4px;font-size:0.8rem;color:#666;}\n.it-figure{margin:14px 0;}\n.it-figure img{display:block;margin:0 auto;border:1px solid #ddd;}\n.it-figure-caption{font-size:0.85em;font-style:italic;text-align:center;color:#444;margin-top:6px;}\n.it-signline{margin:20px 0;padding:0;}\n.it-signline-label{font-size:0.72rem;color:#888;text-transform:uppercase;letter-spacing:0.06em;margin-bottom:4px;}\n.it-signline-rule{border-bottom:1px solid #111;margin-bottom:4px;}\n.it-signline-name{font-size:0.9rem;font-weight:500;color:#111;}\n.it-signline-role{font-size:0.82rem;color:#555;}\n.it-signline-date{font-size:0.82rem;color:#555;margin-top:4px;}\n.it-contact{padding:8px 12px;border:1px solid #ddd;margin:5px 0;}\n.it-contact-name{font-weight:600;font-size:0.95rem;color:#111;}\n.it-contact-role{font-size:0.82rem;color:#555;}\n.it-contact-org{font-size:0.82rem;color:#555;}\n.it-contact-email a,.it-contact-phone a,.it-contact-url a{color:#111;text-decoration:underline;font-size:0.85rem;}\n.it-deadline{padding:8px 12px;border-inline-start:3px solid #4caf50;margin:5px 0;}\n.it-deadline-name{font-weight:600;color:#111;}\n.it-deadline-date{font-size:0.9rem;font-weight:600;color:#111;}\n.it-deadline-consequence{font-size:0.85rem;color:#555;font-style:italic;}\n.it-deadline-owner{font-size:0.82rem;color:#555;}\n.it-deadline-authority{font-size:0.82rem;color:#555;}\n.it-deadline-green{border-color:#4caf50;}\n.it-deadline-amber{border-color:#f57c00;}\n.it-deadline-red{border-color:#c62828;}\n";
@@ -64,8 +64,12 @@ exports.DOCUMENT_CSS = `
64
64
  .intent-callout{display:flex;gap:10px;margin:10px 0;padding-block:6px;padding-inline:0;padding-inline-start:12px;border-inline-start:2px solid #888;align-items:baseline;}
65
65
  .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;}
66
66
  .intent-callout-content{flex:1;color:#222;}
67
- .intent-info{border-color:#888;}
68
- .intent-info .intent-callout-label{color:#444;}
67
+ /* Info is the quiet variant: a soft gray panel with an ⓘ marker and italic
68
+ text — "this is worth noting", not an alarm. */
69
+ .intent-info{background:#f5f6f8;border-inline-start:3px solid #c7ccd3;border-radius:0 3px 3px 0;padding-block:8px;padding-inline-start:12px;padding-inline-end:14px;}
70
+ .intent-info .intent-callout-label{display:none;}
71
+ .intent-info .intent-callout-content{font-style:italic;color:#4f4f4f;}
72
+ .intent-info .intent-callout-content::before{content:"ⓘ ";font-style:normal;font-weight:600;color:#6e6e6e;}
69
73
  .intent-warning{border-color:#888;}
70
74
  .intent-warning .intent-callout-label{color:#444;}
71
75
  .intent-tip{border-color:#888;}
@@ -212,24 +216,29 @@ li{margin:3px 0;color:#222;}
212
216
  sup.it-fn-ref{font-size:0.7em;vertical-align:super;}
213
217
  sup.it-fn-ref a{color:#111;text-decoration:none;border-bottom:1px solid #999;}
214
218
  /* ── v2.8 Document Trust ───────────────────────────────── */
215
- .it-approval{display:flex;gap:10px;margin:10px 0;padding:10px 14px;border:1px solid #4caf50;background:#f8fdf8;}
216
- .it-approval__icon{font-size:1.2rem;color:#4caf50;flex-shrink:0;}
217
- .it-approval__body{display:flex;flex-direction:column;gap:2px;}
218
- .it-approval__label{font-size:0.72rem;font-weight:700;text-transform:uppercase;letter-spacing:0.08em;color:#4caf50;}
219
- .it-approval__who{font-size:0.9rem;color:#222;}
220
- .it-approval__date{font-size:0.8rem;color:#666;}
221
- .it-signature{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:10px 0;padding:10px 14px;border:1px solid #daa520;background:#fffdf5;}
222
- .it-signature--valid{border-color:#4caf50;background:#f8fdf8;}
223
- .it-signature--invalid{border-color:#c62828;background:#fdf5f5;}
219
+ /* Trust blocks are typeset like entries in a legal document — hairlines and
220
+ small-caps labels, no colored fills (ink-first; prints exactly as shown). */
221
+ .it-approval{display:flex;flex-wrap:wrap;gap:10px;align-items:baseline;margin:12px 0;padding:7px 2px;border-bottom:1px solid #ddd;}
222
+ .it-approval__icon{display:none;}
223
+ .it-approval__body{display:contents;}
224
+ .it-approval__label{font-size:0.7rem;font-weight:700;text-transform:uppercase;letter-spacing:0.1em;color:#2e7d32;flex-shrink:0;}
225
+ .it-approval__label::before{content:'✓ ';}
226
+ .it-approval__what{font-size:0.9rem;font-weight:600;color:#111;}
227
+ .it-approval__who{font-size:0.9rem;color:#555;}
228
+ .it-approval__date{font-size:0.8rem;color:#777;margin-inline-start:auto;font-variant-numeric:tabular-nums;}
229
+ .it-signature{display:flex;flex-wrap:wrap;gap:10px;align-items:baseline;margin:14px 0 10px;padding:7px 2px 5px;border-top:1px solid #111;}
230
+ .it-signature--valid{border-top-color:#111;}
231
+ .it-signature--invalid{border-top-color:#c62828;}
224
232
  .it-signature__name{font-weight:600;font-size:0.95rem;color:#111;}
225
233
  .it-signature__role{font-size:0.85rem;color:#555;}
226
- .it-signature__date{font-size:0.8rem;color:#666;}
227
- .it-signature__status{font-size:0.8rem;font-weight:600;margin-inline-start:auto;}
228
- .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;}
229
- .it-sealed-banner__icon{font-size:1.3rem;}
230
- .it-sealed-banner__text{font-size:1rem;color:#c62828;text-transform:uppercase;letter-spacing:0.04em;}
231
- .it-sealed-banner__date{font-size:0.8rem;color:#666;margin-inline-start:auto;}
232
- .it-sealed-banner__hash{font-size:0.72rem;color:#888;font-family:monospace;}
234
+ .it-signature__date{font-size:0.8rem;color:#777;font-variant-numeric:tabular-nums;}
235
+ .it-signature__status{font-size:0.72rem;font-weight:600;margin-inline-start:auto;text-transform:uppercase;letter-spacing:0.08em;color:#2e7d32;}
236
+ .it-signature--invalid .it-signature__status{color:#c62828;}
237
+ .it-sealed-banner{display:flex;flex-wrap:wrap;gap:12px;align-items:baseline;margin:18px 0;padding:8px 2px;border-top:1px solid #111;border-bottom:1px solid #111;}
238
+ .it-sealed-banner__icon{display:none;}
239
+ .it-sealed-banner__text{font-size:0.78rem;font-weight:700;color:#111;text-transform:uppercase;letter-spacing:0.14em;}
240
+ .it-sealed-banner__date{font-size:0.8rem;color:#666;margin-inline-start:auto;font-variant-numeric:tabular-nums;}
241
+ .it-sealed-banner__hash{font-size:0.72rem;color:#999;font-family:'SFMono-Regular',Consolas,monospace;}
233
242
  /* ── v2.11 Keyword Expansion ──────────────────────────── */
234
243
  .it-ref-card{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid #ddd;margin:5px 0;}
235
244
  .it-ref-icon{font-size:1rem;flex-shrink:0;}
package/dist/index.d.ts CHANGED
@@ -26,7 +26,8 @@ export { extractWorkflow } from "./workflow";
26
26
  export type { WorkflowStep, WorkflowGraph } from "./workflow";
27
27
  export { executeWorkflow } from "./executor";
28
28
  export type { WorkflowRuntime, ToolHandler, ExecutionContext, ExecutionResult, ExecutionLogEntry, ExecutionOptions, } from "./executor";
29
- export { computeDocumentHash, findHistoryBoundaryInSource, sealDocument, verifyDocument, generateBlockId, blockFingerprint, matchBlocksToRegistry, computeTrustDiff, incrementVersion, } from "./trust";
29
+ export { computeDocumentHash, findHistoryBoundaryInSource, sealDocument, signDocument, verifyDocument, unsealDocument, isSealed, isSignedBy, generateBlockId, blockFingerprint, matchBlocksToRegistry, computeTrustDiff, incrementVersion, } from "./trust";
30
+ export { upsertMetaProperty, getMetaProperty, flattenBlocks } from "./utils";
30
31
  export type { SealOptions, SealResult, VerifyResult, BlockSnapshot, TrustDiff, } from "./trust";
31
32
  export { updateHistory, parseHistorySection } from "./history";
32
33
  export type { SaveHistoryOptions } from "./history";
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.matchBlocksToRegistry = exports.blockFingerprint = exports.generateBlockId = exports.verifyDocument = exports.sealDocument = exports.findHistoryBoundaryInSource = exports.computeDocumentHash = exports.executeWorkflow = exports.extractWorkflow = exports.diffDocuments = exports.PREDEFINED_SCHEMAS = exports.formatValidationResult = exports.createSchema = exports.validateDocument = exports.queryDocument = exports.formatQueryResult = exports.parseQuery = exports.queryBlocks = exports.convertHtmlToIntentText = exports.convertMarkdownToIntentText = exports.parseAndMerge = exports.mergeData = exports.DOC_STYLE_TARGETS = exports.documentStyleCSS = exports.collectDocumentStyles = exports.cssContentValue = exports.collectPrintLayout = exports.renderPrint = exports.blockToSource = exports.documentToSource = exports.validateDocumentSemantic = exports.renderHTML = exports.parseIntentTextSafe = exports._resetIdCounter = exports.parseIntentText = exports.generateThemeCSS = exports.registerBuiltinTheme = exports.listBuiltinThemes = exports.getBuiltinTheme = exports.tierOf = exports.CORE_KEYWORDS = exports.KEYWORD_TIERS = exports.PUBLIC_KEYWORDS = exports.BOUNDARY_KEYWORDS = exports.COMPAT_ONLY_ALIASES = exports.DEPRECATED_ALIASES = exports.ALIAS_MAP = exports.CANONICAL_KEYWORDS = exports.LANGUAGE_REGISTRY = exports.ALIASES = void 0;
4
- exports.KEYWORDS = exports.serializeContext = exports.askDocuments = exports.formatCSV = exports.formatJSON = exports.formatTable = exports.queryComposed = exports.composeIndexes = exports.updateIndex = exports.checkStaleness = exports.buildIndexEntry = exports.buildShallowIndex = exports.detectHistoryBoundary = exports.parseHistorySection = exports.updateHistory = exports.incrementVersion = exports.computeTrustDiff = void 0;
3
+ exports.isSealed = exports.unsealDocument = exports.verifyDocument = exports.signDocument = exports.sealDocument = exports.findHistoryBoundaryInSource = exports.computeDocumentHash = exports.executeWorkflow = exports.extractWorkflow = exports.diffDocuments = exports.PREDEFINED_SCHEMAS = exports.formatValidationResult = exports.createSchema = exports.validateDocument = exports.queryDocument = exports.formatQueryResult = exports.parseQuery = exports.queryBlocks = exports.convertHtmlToIntentText = exports.convertMarkdownToIntentText = exports.parseAndMerge = exports.mergeData = exports.DOC_STYLE_TARGETS = exports.documentStyleCSS = exports.collectDocumentStyles = exports.cssContentValue = exports.collectPrintLayout = exports.renderPrint = exports.blockToSource = exports.documentToSource = exports.validateDocumentSemantic = exports.renderHTML = exports.parseIntentTextSafe = exports._resetIdCounter = exports.parseIntentText = exports.generateThemeCSS = exports.registerBuiltinTheme = exports.listBuiltinThemes = exports.getBuiltinTheme = exports.tierOf = exports.CORE_KEYWORDS = exports.KEYWORD_TIERS = exports.PUBLIC_KEYWORDS = exports.BOUNDARY_KEYWORDS = exports.COMPAT_ONLY_ALIASES = exports.DEPRECATED_ALIASES = exports.ALIAS_MAP = exports.CANONICAL_KEYWORDS = exports.LANGUAGE_REGISTRY = exports.ALIASES = void 0;
4
+ exports.KEYWORDS = exports.serializeContext = exports.askDocuments = exports.formatCSV = exports.formatJSON = exports.formatTable = exports.queryComposed = exports.composeIndexes = exports.updateIndex = exports.checkStaleness = exports.buildIndexEntry = exports.buildShallowIndex = exports.detectHistoryBoundary = exports.parseHistorySection = exports.updateHistory = exports.flattenBlocks = exports.getMetaProperty = exports.upsertMetaProperty = exports.incrementVersion = exports.computeTrustDiff = exports.matchBlocksToRegistry = exports.blockFingerprint = exports.generateBlockId = exports.isSignedBy = void 0;
5
5
  var aliases_1 = require("./aliases");
6
6
  Object.defineProperty(exports, "ALIASES", { enumerable: true, get: function () { return aliases_1.ALIASES; } });
7
7
  var language_registry_1 = require("./language-registry");
@@ -66,12 +66,20 @@ var trust_1 = require("./trust");
66
66
  Object.defineProperty(exports, "computeDocumentHash", { enumerable: true, get: function () { return trust_1.computeDocumentHash; } });
67
67
  Object.defineProperty(exports, "findHistoryBoundaryInSource", { enumerable: true, get: function () { return trust_1.findHistoryBoundaryInSource; } });
68
68
  Object.defineProperty(exports, "sealDocument", { enumerable: true, get: function () { return trust_1.sealDocument; } });
69
+ Object.defineProperty(exports, "signDocument", { enumerable: true, get: function () { return trust_1.signDocument; } });
69
70
  Object.defineProperty(exports, "verifyDocument", { enumerable: true, get: function () { return trust_1.verifyDocument; } });
71
+ Object.defineProperty(exports, "unsealDocument", { enumerable: true, get: function () { return trust_1.unsealDocument; } });
72
+ Object.defineProperty(exports, "isSealed", { enumerable: true, get: function () { return trust_1.isSealed; } });
73
+ Object.defineProperty(exports, "isSignedBy", { enumerable: true, get: function () { return trust_1.isSignedBy; } });
70
74
  Object.defineProperty(exports, "generateBlockId", { enumerable: true, get: function () { return trust_1.generateBlockId; } });
71
75
  Object.defineProperty(exports, "blockFingerprint", { enumerable: true, get: function () { return trust_1.blockFingerprint; } });
72
76
  Object.defineProperty(exports, "matchBlocksToRegistry", { enumerable: true, get: function () { return trust_1.matchBlocksToRegistry; } });
73
77
  Object.defineProperty(exports, "computeTrustDiff", { enumerable: true, get: function () { return trust_1.computeTrustDiff; } });
74
78
  Object.defineProperty(exports, "incrementVersion", { enumerable: true, get: function () { return trust_1.incrementVersion; } });
79
+ var utils_1 = require("./utils");
80
+ Object.defineProperty(exports, "upsertMetaProperty", { enumerable: true, get: function () { return utils_1.upsertMetaProperty; } });
81
+ Object.defineProperty(exports, "getMetaProperty", { enumerable: true, get: function () { return utils_1.getMetaProperty; } });
82
+ Object.defineProperty(exports, "flattenBlocks", { enumerable: true, get: function () { return utils_1.flattenBlocks; } });
75
83
  var history_1 = require("./history");
76
84
  Object.defineProperty(exports, "updateHistory", { enumerable: true, get: function () { return history_1.updateHistory; } });
77
85
  Object.defineProperty(exports, "parseHistorySection", { enumerable: true, get: function () { return history_1.parseHistorySection; } });
package/dist/parser.js CHANGED
@@ -873,6 +873,23 @@ function parseLine(line, ctx) {
873
873
  inline,
874
874
  };
875
875
  }
876
+ const PIPE_PROP_CONTINUATION = /^\s*\|\s*[\p{L}][\p{L}\d_-]*\s*:\s*[^|]*$/u;
877
+ function mergePipeContinuations(lines) {
878
+ const out = [];
879
+ for (const line of lines) {
880
+ const prev = out.length > 0 ? out[out.length - 1] : "";
881
+ const prevIsTableRow = prev.trimStart().startsWith("|");
882
+ if (out.length > 0 &&
883
+ !prevIsTableRow &&
884
+ PIPE_PROP_CONTINUATION.test(line)) {
885
+ out[out.length - 1] = prev.trimEnd() + " " + line.trimStart();
886
+ }
887
+ else {
888
+ out.push(line);
889
+ }
890
+ }
891
+ return out;
892
+ }
876
893
  function parseIntentText(fileContent, options) {
877
894
  if (typeof fileContent !== "string") {
878
895
  return { version: "1.4", blocks: [], metadata: {}, diagnostics: [] };
@@ -897,7 +914,7 @@ function parseIntentText(fileContent, options) {
897
914
  };
898
915
  }
899
916
  _resetIdCounter();
900
- const lines = fileContent.split(/\r?\n/);
917
+ const lines = mergePipeContinuations(fileContent.split(/\r?\n/));
901
918
  if (lines.length > MAX_LINE_COUNT) {
902
919
  return {
903
920
  version: "1.4",
package/dist/renderer.js CHANGED
@@ -89,6 +89,9 @@ function formatTrustDate(isoStr) {
89
89
  const day = d.getUTCDate();
90
90
  const month = months[d.getUTCMonth()];
91
91
  const year = d.getUTCFullYear();
92
+ if (/^\d{4}-\d{2}-\d{2}$/.test(isoStr.trim())) {
93
+ return `${day} ${month} ${year}`;
94
+ }
92
95
  const hours = String(d.getUTCHours()).padStart(2, "0");
93
96
  const minutes = String(d.getUTCMinutes()).padStart(2, "0");
94
97
  return `${day} ${month} ${year}, ${hours}:${minutes} UTC`;
@@ -811,12 +814,10 @@ function renderBlock(block) {
811
814
  const approveRole = props.role ? escapeHtml(String(props.role)) : "";
812
815
  const approveAt = props.at ? formatTrustDate(String(props.at)) : "";
813
816
  return `<div class="it-approval">
814
- <span class="it-approval__icon">✓</span>
815
- <div class="it-approval__body">
816
- <span class="it-approval__label">APPROVED</span>
817
- <span class="it-approval__who">${approveBy}${approveRole ? ` — ${approveRole}` : ""}</span>
818
- ${approveAt ? `<span class="it-approval__date">${approveAt}</span>` : ""}
819
- </div>
817
+ <span class="it-approval__label">Approved</span>
818
+ ${content ? `<span class="it-approval__what">${content}</span>` : ""}
819
+ <span class="it-approval__who">${approveBy}${approveRole ? `, ${approveRole}` : ""}</span>
820
+ ${approveAt ? `<span class="it-approval__date">${approveAt}</span>` : ""}
820
821
  </div>`;
821
822
  }
822
823
  case "sign": {
@@ -828,7 +829,7 @@ function renderBlock(block) {
828
829
  <span class="it-signature__name">${signerName}</span>
829
830
  ${signRole ? `<span class="it-signature__role">${signRole}</span>` : ""}
830
831
  ${signAt ? `<span class="it-signature__date">${signAt}</span>` : ""}
831
- <span class="it-signature__status">${signValid ? " Verified" : "❌ Invalid"}</span>
832
+ <span class="it-signature__status">${signValid ? "Signed · verified" : "Unverified"}</span>
832
833
  </div>`;
833
834
  }
834
835
  case "freeze": {
@@ -837,8 +838,7 @@ function renderBlock(block) {
837
838
  ? escapeHtml(String(props.hash)).slice(0, 20) + "..."
838
839
  : "";
839
840
  return `<div class="it-sealed-banner">
840
- <span class="it-sealed-banner__icon">🔒</span>
841
- <span class="it-sealed-banner__text">Sealed Document</span>
841
+ <span class="it-sealed-banner__text">Sealed document</span>
842
842
  ${freezeAt ? `<span class="it-sealed-banner__date">${freezeAt}</span>` : ""}
843
843
  ${freezeHash ? `<span class="it-sealed-banner__hash">${freezeHash}</span>` : ""}
844
844
  </div>`;
@@ -0,0 +1,2 @@
1
+ export declare function sha256Hex(input: string): string;
2
+ export declare function randomHex(bytes: number): string;
package/dist/sha256.js ADDED
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sha256Hex = sha256Hex;
4
+ exports.randomHex = randomHex;
5
+ const K = new Uint32Array([
6
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
7
+ 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
8
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
9
+ 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
10
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
11
+ 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
12
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
13
+ 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
14
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
15
+ 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
16
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
17
+ ]);
18
+ function utf8Bytes(str) {
19
+ if (typeof TextEncoder !== "undefined") {
20
+ return new TextEncoder().encode(str);
21
+ }
22
+ const out = [];
23
+ for (let i = 0; i < str.length; i++) {
24
+ let c = str.charCodeAt(i);
25
+ if (c < 0x80)
26
+ out.push(c);
27
+ else if (c < 0x800) {
28
+ out.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f));
29
+ }
30
+ else if (c >= 0xd800 && c <= 0xdbff) {
31
+ const c2 = str.charCodeAt(++i);
32
+ c = 0x10000 + ((c & 0x3ff) << 10) + (c2 & 0x3ff);
33
+ out.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));
34
+ }
35
+ else {
36
+ out.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));
37
+ }
38
+ }
39
+ return new Uint8Array(out);
40
+ }
41
+ function sha256Hex(input) {
42
+ const msg = utf8Bytes(input);
43
+ const len = msg.length;
44
+ const withOne = len + 1;
45
+ const k = (56 - (withOne % 64) + 64) % 64;
46
+ const total = withOne + k + 8;
47
+ const buf = new Uint8Array(total);
48
+ buf.set(msg);
49
+ buf[len] = 0x80;
50
+ const bitLenLo = (len * 8) >>> 0;
51
+ const bitLenHi = Math.floor((len * 8) / 0x100000000) >>> 0;
52
+ const dv = new DataView(buf.buffer);
53
+ dv.setUint32(total - 8, bitLenHi);
54
+ dv.setUint32(total - 4, bitLenLo);
55
+ let h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a, h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19;
56
+ const w = new Uint32Array(64);
57
+ for (let off = 0; off < total; off += 64) {
58
+ for (let i = 0; i < 16; i++)
59
+ w[i] = dv.getUint32(off + i * 4);
60
+ for (let i = 16; i < 64; i++) {
61
+ const a = w[i - 15];
62
+ const b = w[i - 2];
63
+ const s0 = ((a >>> 7) | (a << 25)) ^ ((a >>> 18) | (a << 14)) ^ (a >>> 3);
64
+ const s1 = ((b >>> 17) | (b << 15)) ^ ((b >>> 19) | (b << 13)) ^ (b >>> 10);
65
+ w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;
66
+ }
67
+ let a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, h = h7;
68
+ for (let i = 0; i < 64; i++) {
69
+ const S1 = ((e >>> 6) | (e << 26)) ^
70
+ ((e >>> 11) | (e << 21)) ^
71
+ ((e >>> 25) | (e << 7));
72
+ const ch = (e & f) ^ (~e & g);
73
+ const t1 = (h + S1 + ch + K[i] + w[i]) >>> 0;
74
+ const S0 = ((a >>> 2) | (a << 30)) ^
75
+ ((a >>> 13) | (a << 19)) ^
76
+ ((a >>> 22) | (a << 10));
77
+ const maj = (a & b) ^ (a & c) ^ (b & c);
78
+ const t2 = (S0 + maj) >>> 0;
79
+ h = g;
80
+ g = f;
81
+ f = e;
82
+ e = (d + t1) >>> 0;
83
+ d = c;
84
+ c = b;
85
+ b = a;
86
+ a = (t1 + t2) >>> 0;
87
+ }
88
+ h0 = (h0 + a) >>> 0;
89
+ h1 = (h1 + b) >>> 0;
90
+ h2 = (h2 + c) >>> 0;
91
+ h3 = (h3 + d) >>> 0;
92
+ h4 = (h4 + e) >>> 0;
93
+ h5 = (h5 + f) >>> 0;
94
+ h6 = (h6 + g) >>> 0;
95
+ h7 = (h7 + h) >>> 0;
96
+ }
97
+ const toHex = (n) => (n >>> 0).toString(16).padStart(8, "0");
98
+ return (toHex(h0) +
99
+ toHex(h1) +
100
+ toHex(h2) +
101
+ toHex(h3) +
102
+ toHex(h4) +
103
+ toHex(h5) +
104
+ toHex(h6) +
105
+ toHex(h7));
106
+ }
107
+ function randomHex(bytes) {
108
+ const arr = new Uint8Array(bytes);
109
+ const g = typeof globalThis !== "undefined" ? globalThis : {};
110
+ if (g.crypto && typeof g.crypto.getRandomValues === "function") {
111
+ g.crypto.getRandomValues(arr);
112
+ }
113
+ else {
114
+ for (let i = 0; i < bytes; i++)
115
+ arr[i] = (randomFallbackCounter++ * 167) & 0xff;
116
+ }
117
+ let out = "";
118
+ for (let i = 0; i < bytes; i++)
119
+ out += arr[i].toString(16).padStart(2, "0");
120
+ return out;
121
+ }
122
+ let randomFallbackCounter = 1;
package/dist/trust.d.ts CHANGED
@@ -46,6 +46,19 @@ export interface SealResult {
46
46
  at: string;
47
47
  error?: string;
48
48
  }
49
+ export declare function isSealed(source: string): boolean;
50
+ export declare function isSignedBy(source: string, signer: string): boolean;
51
+ export declare function unsealDocument(source: string): string;
52
+ export interface SignResult {
53
+ success: boolean;
54
+ source: string;
55
+ at: string;
56
+ note?: string;
57
+ }
58
+ export declare function signDocument(source: string, options: {
59
+ signer: string;
60
+ role?: string;
61
+ }): SignResult;
49
62
  export declare function sealDocument(source: string, options: SealOptions): SealResult;
50
63
  export interface VerifyResult {
51
64
  intact: boolean;
package/dist/trust.js CHANGED
@@ -1,7 +1,4 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.computeDocumentHash = computeDocumentHash;
7
4
  exports.findHistoryBoundaryInSource = findHistoryBoundaryInSource;
@@ -11,9 +8,13 @@ exports.blockFingerprint = blockFingerprint;
11
8
  exports.matchBlocksToRegistry = matchBlocksToRegistry;
12
9
  exports.computeTrustDiff = computeTrustDiff;
13
10
  exports.incrementVersion = incrementVersion;
11
+ exports.isSealed = isSealed;
12
+ exports.isSignedBy = isSignedBy;
13
+ exports.unsealDocument = unsealDocument;
14
+ exports.signDocument = signDocument;
14
15
  exports.sealDocument = sealDocument;
15
16
  exports.verifyDocument = verifyDocument;
16
- const crypto_1 = __importDefault(require("crypto"));
17
+ const sha256_1 = require("./sha256");
17
18
  const parser_1 = require("./parser");
18
19
  function computeDocumentHash(source) {
19
20
  const boundary = findHistoryBoundaryInSource(source);
@@ -24,7 +25,7 @@ function computeDocumentHash(source) {
24
25
  !line.startsWith("freeze:") &&
25
26
  !line.startsWith("amendment:"));
26
27
  const body = bodyLines.join("\n").trim();
27
- return "sha256:" + crypto_1.default.createHash("sha256").update(body).digest("hex");
28
+ return "sha256:" + (0, sha256_1.sha256Hex)(body);
28
29
  }
29
30
  function findHistoryBoundaryInSource(source) {
30
31
  const lines = source.split("\n");
@@ -60,7 +61,7 @@ function detectHistoryBoundary(lines) {
60
61
  return -1;
61
62
  }
62
63
  function generateBlockId() {
63
- return crypto_1.default.randomBytes(3).toString("hex").slice(0, 5);
64
+ return (0, sha256_1.randomHex)(3).slice(0, 5);
64
65
  }
65
66
  function blockFingerprint(content) {
66
67
  return content.toLowerCase().trim().replace(/\s+/g, " ");
@@ -153,7 +154,46 @@ function incrementVersion(current, changeType) {
153
154
  return `${parts[0]}.${(parts[1] || 0) + 1}`;
154
155
  }
155
156
  }
157
+ function isSealed(source) {
158
+ return source.split("\n").some((l) => l.trimStart().startsWith("freeze:"));
159
+ }
160
+ function isSignedBy(source, signer) {
161
+ const needle = `sign: ${signer}`;
162
+ return source
163
+ .split("\n")
164
+ .some((l) => l.trimStart().startsWith(needle));
165
+ }
166
+ function unsealDocument(source) {
167
+ const kept = source
168
+ .split("\n")
169
+ .filter((l) => !l.trimStart().startsWith("freeze:"));
170
+ return kept.join("\n").replace(/\n{3,}/g, "\n\n");
171
+ }
172
+ function signDocument(source, options) {
173
+ const at = new Date().toISOString();
174
+ if (isSignedBy(source, options.signer)) {
175
+ return { success: true, source, at, note: "already-signed" };
176
+ }
177
+ const hash = computeDocumentHash(source);
178
+ const signLine = `sign: ${options.signer}${options.role ? ` | role: ${options.role}` : ""} | at: ${at} | hash: ${hash}`;
179
+ const lines = source.replace(/\n+$/, "").split("\n");
180
+ const freezeIdx = lines.findIndex((l) => l.trimStart().startsWith("freeze:"));
181
+ const histIdx = lines.findIndex((l) => l.trim() === "history:" || l.trim() === "history");
182
+ const insertAt = freezeIdx !== -1 ? freezeIdx : histIdx !== -1 ? histIdx : lines.length;
183
+ lines.splice(insertAt, 0, signLine);
184
+ return { success: true, source: lines.join("\n") + "\n", at };
185
+ }
156
186
  function sealDocument(source, options) {
187
+ if (isSealed(source)) {
188
+ const v = verifyDocument(source);
189
+ return {
190
+ success: true,
191
+ hash: v.expectedHash ?? computeDocumentHash(source),
192
+ source,
193
+ at: v.frozenAt ?? new Date().toISOString(),
194
+ error: "already-sealed",
195
+ };
196
+ }
157
197
  const hash = computeDocumentHash(source);
158
198
  const at = new Date().toISOString();
159
199
  const boundaryPos = findHistoryBoundaryInSource(source);
package/dist/utils.d.ts CHANGED
@@ -1,2 +1,4 @@
1
1
  import { IntentBlock } from "./types";
2
2
  export declare function flattenBlocks(blocks: IntentBlock[]): IntentBlock[];
3
+ export declare function upsertMetaProperty(source: string, key: string, value: string | null | undefined): string;
4
+ export declare function getMetaProperty(source: string, key: string): string | undefined;
package/dist/utils.js CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.flattenBlocks = flattenBlocks;
4
+ exports.upsertMetaProperty = upsertMetaProperty;
5
+ exports.getMetaProperty = getMetaProperty;
4
6
  function flattenBlocks(blocks) {
5
7
  const result = [];
6
8
  for (const block of blocks) {
@@ -11,3 +13,40 @@ function flattenBlocks(blocks) {
11
13
  }
12
14
  return result;
13
15
  }
16
+ function upsertMetaProperty(source, key, value) {
17
+ const stripKey = (line) => {
18
+ const re = new RegExp(`\\s*\\|\\s*${key}\\s*:[^|]*`, "gi");
19
+ return line.replace(re, "").trimEnd();
20
+ };
21
+ const lines = source.split("\n");
22
+ const metaIdx = lines.findIndex((l) => /^\s*meta:/i.test(l));
23
+ if (metaIdx !== -1) {
24
+ let cleaned = stripKey(lines[metaIdx]);
25
+ if (value != null && value !== "") {
26
+ cleaned = `${cleaned} | ${key}: ${value}`;
27
+ }
28
+ if (/^\s*meta:\s*$/i.test(cleaned)) {
29
+ lines.splice(metaIdx, 1);
30
+ }
31
+ else {
32
+ lines[metaIdx] = cleaned;
33
+ }
34
+ return lines.join("\n");
35
+ }
36
+ if (value == null || value === "")
37
+ return source;
38
+ const newMeta = `meta: | ${key}: ${value}`;
39
+ const anchorIdx = lines.findIndex((l) => /^\s*(title:|summary:)/i.test(l));
40
+ if (anchorIdx !== -1) {
41
+ lines.splice(anchorIdx + 1, 0, newMeta);
42
+ return lines.join("\n");
43
+ }
44
+ return `${newMeta}\n${source}`;
45
+ }
46
+ function getMetaProperty(source, key) {
47
+ const metaLine = source.split("\n").find((l) => /^\s*meta:/i.test(l));
48
+ if (!metaLine)
49
+ return undefined;
50
+ const m = new RegExp(`\\|\\s*${key}\\s*:\\s*([^|]*)`, "i").exec(metaLine);
51
+ return m ? m[1].trim() : undefined;
52
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotit/core",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "IntentText Parser, HTML Renderer, and Converters",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",