@m4ike1/ion-cue 0.1.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 (66) hide show
  1. package/README.md +92 -0
  2. package/dist/dispatcher.d.ts +31 -0
  3. package/dist/dispatcher.d.ts.map +1 -0
  4. package/dist/dispatcher.js +230 -0
  5. package/dist/dispatcher.js.map +1 -0
  6. package/dist/harness-bridge.d.ts +13 -0
  7. package/dist/harness-bridge.d.ts.map +1 -0
  8. package/dist/harness-bridge.js +29 -0
  9. package/dist/harness-bridge.js.map +1 -0
  10. package/dist/harness-router.d.ts +12 -0
  11. package/dist/harness-router.d.ts.map +1 -0
  12. package/dist/harness-router.js +189 -0
  13. package/dist/harness-router.js.map +1 -0
  14. package/dist/index.d.ts +16 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +12 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/injector.d.ts +23 -0
  19. package/dist/injector.d.ts.map +1 -0
  20. package/dist/injector.js +62 -0
  21. package/dist/injector.js.map +1 -0
  22. package/dist/marks.d.ts +26 -0
  23. package/dist/marks.d.ts.map +1 -0
  24. package/dist/marks.js +59 -0
  25. package/dist/marks.js.map +1 -0
  26. package/dist/messages.d.ts +23 -0
  27. package/dist/messages.d.ts.map +1 -0
  28. package/dist/messages.js +2 -0
  29. package/dist/messages.js.map +1 -0
  30. package/dist/registry.d.ts +94 -0
  31. package/dist/registry.d.ts.map +1 -0
  32. package/dist/registry.js +582 -0
  33. package/dist/registry.js.map +1 -0
  34. package/dist/resolver.d.ts +15 -0
  35. package/dist/resolver.d.ts.map +1 -0
  36. package/dist/resolver.js +50 -0
  37. package/dist/resolver.js.map +1 -0
  38. package/dist/scanner.d.ts +32 -0
  39. package/dist/scanner.d.ts.map +1 -0
  40. package/dist/scanner.js +252 -0
  41. package/dist/scanner.js.map +1 -0
  42. package/dist/scope.d.ts +25 -0
  43. package/dist/scope.d.ts.map +1 -0
  44. package/dist/scope.js +180 -0
  45. package/dist/scope.js.map +1 -0
  46. package/dist/secret-store.d.ts +16 -0
  47. package/dist/secret-store.d.ts.map +1 -0
  48. package/dist/secret-store.js +89 -0
  49. package/dist/secret-store.js.map +1 -0
  50. package/dist/stream-events.d.ts +26 -0
  51. package/dist/stream-events.d.ts.map +1 -0
  52. package/dist/stream-events.js +2 -0
  53. package/dist/stream-events.js.map +1 -0
  54. package/dist/toml.d.ts +3 -0
  55. package/dist/toml.d.ts.map +1 -0
  56. package/dist/toml.js +117 -0
  57. package/dist/toml.js.map +1 -0
  58. package/dist/types.d.ts +182 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +2 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/validation.d.ts +5 -0
  63. package/dist/validation.d.ts.map +1 -0
  64. package/dist/validation.js +61 -0
  65. package/dist/validation.js.map +1 -0
  66. package/package.json +23 -0
@@ -0,0 +1,182 @@
1
+ import type { CueMessage } from "./messages.ts";
2
+ export type BehavioralDimension = "tone" | "register" | "length" | "depth" | "structure" | "format" | "voice" | "vocabulary";
3
+ export interface TagDef {
4
+ description: string;
5
+ overrides: BehavioralDimension[];
6
+ exclusive?: boolean;
7
+ inline?: string;
8
+ }
9
+ export interface UsesEntry {
10
+ tag: string;
11
+ source: string;
12
+ }
13
+ export interface ElementDef {
14
+ name: string;
15
+ description: string;
16
+ version: string;
17
+ class: "model" | "harness";
18
+ handler?: string;
19
+ allowedTools?: string;
20
+ inputs?: string[];
21
+ tags: Record<string, TagDef>;
22
+ uses: UsesEntry[];
23
+ bodyPath?: string;
24
+ tomlPath?: string;
25
+ }
26
+ export interface SectionRange {
27
+ start: number;
28
+ end: number;
29
+ tag: string;
30
+ }
31
+ export type ScopeKind = "file" | "glob" | "id" | "skill";
32
+ export interface CueScope {
33
+ type: ScopeKind;
34
+ value: string;
35
+ /** Line range (1-indexed, inclusive). Missing bound means open-ended (`:10-`, `:-20`). */
36
+ range?: {
37
+ start?: number;
38
+ end?: number;
39
+ };
40
+ }
41
+ export interface CueDirective {
42
+ raw: string;
43
+ element: string;
44
+ version?: string;
45
+ tags: string[];
46
+ /** Cues are purely behavioral — never populated by the scanner. Kept for type stability. */
47
+ scope: CueScope | null;
48
+ line: number;
49
+ col: number;
50
+ /** Character offset in the input message, for injection ordering. */
51
+ position?: number;
52
+ }
53
+ export interface SystemNavCommand {
54
+ command: string;
55
+ arg?: string;
56
+ }
57
+ export interface AliasCommand {
58
+ command: string;
59
+ }
60
+ export interface ScopeOnlyStatement {
61
+ scope: CueScope;
62
+ /** Character offset of `{` in the input message. */
63
+ position: number;
64
+ raw: string;
65
+ }
66
+ export type Directive = {
67
+ kind: "cue";
68
+ directive: CueDirective;
69
+ } | {
70
+ kind: "system-nav";
71
+ command: SystemNavCommand;
72
+ } | {
73
+ kind: "alias";
74
+ command: AliasCommand;
75
+ } | {
76
+ kind: "scope-only";
77
+ statement: ScopeOnlyStatement;
78
+ };
79
+ export interface Injection {
80
+ text: string;
81
+ scope: CueScope | null;
82
+ }
83
+ export interface ScanError {
84
+ message: string;
85
+ raw: string;
86
+ line: number;
87
+ col: number;
88
+ }
89
+ export interface HarnessAction {
90
+ element: string;
91
+ handler: string;
92
+ args: Record<string, unknown>;
93
+ }
94
+ export interface DispatchResult {
95
+ injections: Injection[];
96
+ harnessActions: HarnessAction[];
97
+ error?: string;
98
+ }
99
+ export interface HookInput {
100
+ session_id: string;
101
+ transcript_path: string;
102
+ cwd: string;
103
+ permission_mode: string;
104
+ hook_event_name: string;
105
+ prompt: string;
106
+ }
107
+ export interface HookOutput {
108
+ hookSpecificOutput?: {
109
+ hookEventName: string;
110
+ additionalContext?: string;
111
+ };
112
+ decision?: "block";
113
+ reason?: string;
114
+ }
115
+ export type HarnessHandler = (ctx: HarnessContext) => HarnessResult | Promise<HarnessResult>;
116
+ export interface HarnessContext {
117
+ element: ElementDef;
118
+ directive: CueDirective;
119
+ session: SessionState;
120
+ args: Record<string, unknown>;
121
+ }
122
+ export interface HarnessResult {
123
+ action: "handled" | "error";
124
+ data?: unknown;
125
+ error?: string;
126
+ }
127
+ export interface SessionState {
128
+ mode: string;
129
+ activeElements: Map<string, ActiveElement>;
130
+ overrides: Map<string, string>;
131
+ dispatchHistory: DispatchEntry[];
132
+ }
133
+ export interface ActiveElement {
134
+ element: ElementDef;
135
+ tags: string[];
136
+ scope: CueScope | null;
137
+ activatedAt: number;
138
+ }
139
+ export interface DispatchEntry {
140
+ directive: CueDirective;
141
+ element: ElementDef;
142
+ tags: string[];
143
+ scope: CueScope | null;
144
+ timestamp: number;
145
+ }
146
+ export interface CueBeforeToolCallContext {
147
+ name: string;
148
+ args: Record<string, unknown>;
149
+ sessionId: string;
150
+ }
151
+ export interface CueBeforeToolCallResult {
152
+ block?: boolean;
153
+ reason?: string;
154
+ }
155
+ export interface CueAfterToolCallContext {
156
+ name: string;
157
+ args: Record<string, unknown>;
158
+ result: unknown;
159
+ sessionId: string;
160
+ }
161
+ export interface CueRegisteredTool {
162
+ name: string;
163
+ description: string;
164
+ inputSchema: Record<string, unknown>;
165
+ execute: (args: Record<string, unknown>, signal?: AbortSignal) => Promise<unknown>;
166
+ executionMode?: "parallel" | "sequential";
167
+ beforeToolCall?: (ctx: CueBeforeToolCallContext) => Promise<CueBeforeToolCallResult> | CueBeforeToolCallResult;
168
+ afterToolCall?: (ctx: CueAfterToolCallContext) => Promise<unknown> | undefined;
169
+ }
170
+ export interface CueToolSchema {
171
+ name: string;
172
+ description: string;
173
+ input_schema: Record<string, unknown>;
174
+ }
175
+ export interface CueAgentConfig {
176
+ streamFn: (messages: CueMessage[], tools?: CueToolSchema[], signal?: AbortSignal) => AsyncIterable<import("./stream-events.ts").CueStreamEvent>;
177
+ tools: CueRegisteredTool[];
178
+ dispatcher: any;
179
+ persist?: string;
180
+ theme?: string;
181
+ }
182
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,MAAM,mBAAmB,GAC5B,MAAM,GACN,UAAU,GACV,QAAQ,GACR,OAAO,GACP,WAAW,GACX,QAAQ,GACR,OAAO,GACP,YAAY,CAAC;AAEhB,MAAM,WAAW,MAAM;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC;AAED,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,8FAA4F;IAC5F,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,QAAQ,CAAC;IAChB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,SAAS,GAClB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,SAAS,EAAE,YAAY,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC9B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IAC1B,kBAAkB,CAAC,EAAE;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAE7F,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,UAAU,CAAC;IACpB,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC7B,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3C,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,eAAe,EAAE,aAAa,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACvC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnF,aAAa,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IAC1C,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,wBAAwB,KAAK,OAAO,CAAC,uBAAuB,CAAC,GAAG,uBAAuB,CAAC;IAC/G,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,uBAAuB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;CAC/E;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,CACT,QAAQ,EAAE,UAAU,EAAE,EACtB,KAAK,CAAC,EAAE,aAAa,EAAE,EACvB,MAAM,CAAC,EAAE,WAAW,KAChB,aAAa,CAAC,OAAO,oBAAoB,EAAE,cAAc,CAAC,CAAC;IAChE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,UAAU,EAAE,GAAG,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf","sourcesContent":["import type { CueMessage } from \"./messages.ts\";\n\nexport type BehavioralDimension =\n\t| \"tone\"\n\t| \"register\"\n\t| \"length\"\n\t| \"depth\"\n\t| \"structure\"\n\t| \"format\"\n\t| \"voice\"\n\t| \"vocabulary\";\n\nexport interface TagDef {\n\tdescription: string;\n\toverrides: BehavioralDimension[];\n\texclusive?: boolean;\n\tinline?: string;\n}\n\nexport interface UsesEntry {\n\ttag: string;\n\tsource: string;\n}\n\nexport interface ElementDef {\n\tname: string;\n\tdescription: string;\n\tversion: string;\n\tclass: \"model\" | \"harness\";\n\thandler?: string;\n\tallowedTools?: string;\n\tinputs?: string[];\n\ttags: Record<string, TagDef>;\n\tuses: UsesEntry[];\n\tbodyPath?: string;\n\ttomlPath?: string;\n}\n\nexport interface SectionRange {\n\tstart: number;\n\tend: number;\n\ttag: string;\n}\n\nexport type ScopeKind = \"file\" | \"glob\" | \"id\" | \"skill\";\n\nexport interface CueScope {\n\ttype: ScopeKind;\n\tvalue: string;\n\t/** Line range (1-indexed, inclusive). Missing bound means open-ended (`:10-`, `:-20`). */\n\trange?: { start?: number; end?: number };\n}\n\nexport interface CueDirective {\n\traw: string;\n\telement: string;\n\tversion?: string;\n\ttags: string[];\n\t/** Cues are purely behavioral — never populated by the scanner. Kept for type stability. */\n\tscope: CueScope | null;\n\tline: number;\n\tcol: number;\n\t/** Character offset in the input message, for injection ordering. */\n\tposition?: number;\n}\n\nexport interface SystemNavCommand {\n\tcommand: string;\n\targ?: string;\n}\n\nexport interface AliasCommand {\n\tcommand: string;\n}\n\nexport interface ScopeOnlyStatement {\n\tscope: CueScope;\n\t/** Character offset of `{` in the input message. */\n\tposition: number;\n\traw: string;\n}\n\nexport type Directive =\n\t| { kind: \"cue\"; directive: CueDirective }\n\t| { kind: \"system-nav\"; command: SystemNavCommand }\n\t| { kind: \"alias\"; command: AliasCommand }\n\t| { kind: \"scope-only\"; statement: ScopeOnlyStatement };\n\nexport interface Injection {\n\ttext: string;\n\tscope: CueScope | null;\n}\n\nexport interface ScanError {\n\tmessage: string;\n\traw: string;\n\tline: number;\n\tcol: number;\n}\n\nexport interface HarnessAction {\n\telement: string;\n\thandler: string;\n\targs: Record<string, unknown>;\n}\n\nexport interface DispatchResult {\n\tinjections: Injection[];\n\tharnessActions: HarnessAction[];\n\terror?: string;\n}\n\nexport interface HookInput {\n\tsession_id: string;\n\ttranscript_path: string;\n\tcwd: string;\n\tpermission_mode: string;\n\thook_event_name: string;\n\tprompt: string;\n}\n\nexport interface HookOutput {\n\thookSpecificOutput?: {\n\t\thookEventName: string;\n\t\tadditionalContext?: string;\n\t};\n\tdecision?: \"block\";\n\treason?: string;\n}\n\nexport type HarnessHandler = (ctx: HarnessContext) => HarnessResult | Promise<HarnessResult>;\n\nexport interface HarnessContext {\n\telement: ElementDef;\n\tdirective: CueDirective;\n\tsession: SessionState;\n\targs: Record<string, unknown>;\n}\n\nexport interface HarnessResult {\n\taction: \"handled\" | \"error\";\n\tdata?: unknown;\n\terror?: string;\n}\n\nexport interface SessionState {\n\tmode: string;\n\tactiveElements: Map<string, ActiveElement>;\n\toverrides: Map<string, string>;\n\tdispatchHistory: DispatchEntry[];\n}\n\nexport interface ActiveElement {\n\telement: ElementDef;\n\ttags: string[];\n\tscope: CueScope | null;\n\tactivatedAt: number;\n}\n\nexport interface DispatchEntry {\n\tdirective: CueDirective;\n\telement: ElementDef;\n\ttags: string[];\n\tscope: CueScope | null;\n\ttimestamp: number;\n}\n\nexport interface CueBeforeToolCallContext {\n\tname: string;\n\targs: Record<string, unknown>;\n\tsessionId: string;\n}\n\nexport interface CueBeforeToolCallResult {\n\tblock?: boolean;\n\treason?: string;\n}\n\nexport interface CueAfterToolCallContext {\n\tname: string;\n\targs: Record<string, unknown>;\n\tresult: unknown;\n\tsessionId: string;\n}\n\nexport interface CueRegisteredTool {\n\tname: string;\n\tdescription: string;\n\tinputSchema: Record<string, unknown>;\n\texecute: (args: Record<string, unknown>, signal?: AbortSignal) => Promise<unknown>;\n\texecutionMode?: \"parallel\" | \"sequential\";\n\tbeforeToolCall?: (ctx: CueBeforeToolCallContext) => Promise<CueBeforeToolCallResult> | CueBeforeToolCallResult;\n\tafterToolCall?: (ctx: CueAfterToolCallContext) => Promise<unknown> | undefined;\n}\n\nexport interface CueToolSchema {\n\tname: string;\n\tdescription: string;\n\tinput_schema: Record<string, unknown>;\n}\n\nexport interface CueAgentConfig {\n\tstreamFn: (\n\t\tmessages: CueMessage[],\n\t\ttools?: CueToolSchema[],\n\t\tsignal?: AbortSignal,\n\t) => AsyncIterable<import(\"./stream-events.ts\").CueStreamEvent>;\n\ttools: CueRegisteredTool[];\n\tdispatcher: any;\n\tpersist?: string;\n\ttheme?: string;\n}\n"]}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { CueMessage } from \"./messages.ts\";\n\nexport type BehavioralDimension =\n\t| \"tone\"\n\t| \"register\"\n\t| \"length\"\n\t| \"depth\"\n\t| \"structure\"\n\t| \"format\"\n\t| \"voice\"\n\t| \"vocabulary\";\n\nexport interface TagDef {\n\tdescription: string;\n\toverrides: BehavioralDimension[];\n\texclusive?: boolean;\n\tinline?: string;\n}\n\nexport interface UsesEntry {\n\ttag: string;\n\tsource: string;\n}\n\nexport interface ElementDef {\n\tname: string;\n\tdescription: string;\n\tversion: string;\n\tclass: \"model\" | \"harness\";\n\thandler?: string;\n\tallowedTools?: string;\n\tinputs?: string[];\n\ttags: Record<string, TagDef>;\n\tuses: UsesEntry[];\n\tbodyPath?: string;\n\ttomlPath?: string;\n}\n\nexport interface SectionRange {\n\tstart: number;\n\tend: number;\n\ttag: string;\n}\n\nexport type ScopeKind = \"file\" | \"glob\" | \"id\" | \"skill\";\n\nexport interface CueScope {\n\ttype: ScopeKind;\n\tvalue: string;\n\t/** Line range (1-indexed, inclusive). Missing bound means open-ended (`:10-`, `:-20`). */\n\trange?: { start?: number; end?: number };\n}\n\nexport interface CueDirective {\n\traw: string;\n\telement: string;\n\tversion?: string;\n\ttags: string[];\n\t/** Cues are purely behavioral — never populated by the scanner. Kept for type stability. */\n\tscope: CueScope | null;\n\tline: number;\n\tcol: number;\n\t/** Character offset in the input message, for injection ordering. */\n\tposition?: number;\n}\n\nexport interface SystemNavCommand {\n\tcommand: string;\n\targ?: string;\n}\n\nexport interface AliasCommand {\n\tcommand: string;\n}\n\nexport interface ScopeOnlyStatement {\n\tscope: CueScope;\n\t/** Character offset of `{` in the input message. */\n\tposition: number;\n\traw: string;\n}\n\nexport type Directive =\n\t| { kind: \"cue\"; directive: CueDirective }\n\t| { kind: \"system-nav\"; command: SystemNavCommand }\n\t| { kind: \"alias\"; command: AliasCommand }\n\t| { kind: \"scope-only\"; statement: ScopeOnlyStatement };\n\nexport interface Injection {\n\ttext: string;\n\tscope: CueScope | null;\n}\n\nexport interface ScanError {\n\tmessage: string;\n\traw: string;\n\tline: number;\n\tcol: number;\n}\n\nexport interface HarnessAction {\n\telement: string;\n\thandler: string;\n\targs: Record<string, unknown>;\n}\n\nexport interface DispatchResult {\n\tinjections: Injection[];\n\tharnessActions: HarnessAction[];\n\terror?: string;\n}\n\nexport interface HookInput {\n\tsession_id: string;\n\ttranscript_path: string;\n\tcwd: string;\n\tpermission_mode: string;\n\thook_event_name: string;\n\tprompt: string;\n}\n\nexport interface HookOutput {\n\thookSpecificOutput?: {\n\t\thookEventName: string;\n\t\tadditionalContext?: string;\n\t};\n\tdecision?: \"block\";\n\treason?: string;\n}\n\nexport type HarnessHandler = (ctx: HarnessContext) => HarnessResult | Promise<HarnessResult>;\n\nexport interface HarnessContext {\n\telement: ElementDef;\n\tdirective: CueDirective;\n\tsession: SessionState;\n\targs: Record<string, unknown>;\n}\n\nexport interface HarnessResult {\n\taction: \"handled\" | \"error\";\n\tdata?: unknown;\n\terror?: string;\n}\n\nexport interface SessionState {\n\tmode: string;\n\tactiveElements: Map<string, ActiveElement>;\n\toverrides: Map<string, string>;\n\tdispatchHistory: DispatchEntry[];\n}\n\nexport interface ActiveElement {\n\telement: ElementDef;\n\ttags: string[];\n\tscope: CueScope | null;\n\tactivatedAt: number;\n}\n\nexport interface DispatchEntry {\n\tdirective: CueDirective;\n\telement: ElementDef;\n\ttags: string[];\n\tscope: CueScope | null;\n\ttimestamp: number;\n}\n\nexport interface CueBeforeToolCallContext {\n\tname: string;\n\targs: Record<string, unknown>;\n\tsessionId: string;\n}\n\nexport interface CueBeforeToolCallResult {\n\tblock?: boolean;\n\treason?: string;\n}\n\nexport interface CueAfterToolCallContext {\n\tname: string;\n\targs: Record<string, unknown>;\n\tresult: unknown;\n\tsessionId: string;\n}\n\nexport interface CueRegisteredTool {\n\tname: string;\n\tdescription: string;\n\tinputSchema: Record<string, unknown>;\n\texecute: (args: Record<string, unknown>, signal?: AbortSignal) => Promise<unknown>;\n\texecutionMode?: \"parallel\" | \"sequential\";\n\tbeforeToolCall?: (ctx: CueBeforeToolCallContext) => Promise<CueBeforeToolCallResult> | CueBeforeToolCallResult;\n\tafterToolCall?: (ctx: CueAfterToolCallContext) => Promise<unknown> | undefined;\n}\n\nexport interface CueToolSchema {\n\tname: string;\n\tdescription: string;\n\tinput_schema: Record<string, unknown>;\n}\n\nexport interface CueAgentConfig {\n\tstreamFn: (\n\t\tmessages: CueMessage[],\n\t\ttools?: CueToolSchema[],\n\t\tsignal?: AbortSignal,\n\t) => AsyncIterable<import(\"./stream-events.ts\").CueStreamEvent>;\n\ttools: CueRegisteredTool[];\n\tdispatcher: any;\n\tpersist?: string;\n\ttheme?: string;\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import type { CueDirective, ElementDef } from "./types.ts";
2
+ export declare function validateVersionPin(version: string): string | null;
3
+ export declare function detectCircularUses(elements: Map<string, ElementDef>): string[];
4
+ export declare function detectConflictingReplace(directives: CueDirective[]): string[];
5
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOjE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,EAAE,CAsC9E;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,MAAM,EAAE,CAgB7E","sourcesContent":["import type { CueDirective, ElementDef } from \"./types.ts\";\n\nexport function validateVersionPin(version: string): string | null {\n\tif (!version) return null;\n\tconst semverRe = /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.]+)?(\\+[a-zA-Z0-9.]+)?$/;\n\tif (!semverRe.test(version)) {\n\t\treturn `Malformed version pin: '${version}' is not a valid semver range`;\n\t}\n\treturn null;\n}\n\nexport function detectCircularUses(elements: Map<string, ElementDef>): string[] {\n\tconst errors: string[] = [];\n\tconst cycles = new Set<string>();\n\tconst visited = new Set<string>();\n\n\tfunction dfs(name: string, path: string[], stack: Set<string>) {\n\t\tif (stack.has(name)) {\n\t\t\tconst cycleStart = path.indexOf(name);\n\t\t\tconst cycleNodes = [...path.slice(cycleStart), name].sort();\n\t\t\tconst cycleKey = cycleNodes.join(\"→\");\n\t\t\tif (!cycles.has(cycleKey)) {\n\t\t\t\tcycles.add(cycleKey);\n\t\t\t\terrors.push(`Circular [[uses]] detected: ${path.slice(cycleStart).join(\" → \")} → ${name}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (visited.has(name)) return;\n\n\t\tvisited.add(name);\n\t\tstack.add(name);\n\n\t\tconst el = elements.get(name);\n\t\tif (el) {\n\t\t\tfor (const use of el.uses) {\n\t\t\t\tdfs(use.tag, [...path, name], stack);\n\t\t\t}\n\t\t}\n\n\t\tstack.delete(name);\n\t}\n\n\tfor (const [name] of elements) {\n\t\tif (!name.includes(\"/\")) {\n\t\t\tdfs(name, [], new Set());\n\t\t}\n\t}\n\n\treturn errors;\n}\n\nexport function detectConflictingReplace(directives: CueDirective[]): string[] {\n\tconst errors: string[] = [];\n\tconst scopeTargets = new Map<string, CueDirective[]>();\n\n\tfor (const d of directives) {\n\t\tif (!d.scope) continue;\n\t\tconst key = d.scope.value;\n\t\tconst existing = scopeTargets.get(key);\n\t\tif (existing) {\n\t\t\texisting.push(d);\n\t\t} else {\n\t\t\tscopeTargets.set(key, [d]);\n\t\t}\n\t}\n\n\treturn errors;\n}\n"]}
@@ -0,0 +1,61 @@
1
+ export function validateVersionPin(version) {
2
+ if (!version)
3
+ return null;
4
+ const semverRe = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?(\+[a-zA-Z0-9.]+)?$/;
5
+ if (!semverRe.test(version)) {
6
+ return `Malformed version pin: '${version}' is not a valid semver range`;
7
+ }
8
+ return null;
9
+ }
10
+ export function detectCircularUses(elements) {
11
+ const errors = [];
12
+ const cycles = new Set();
13
+ const visited = new Set();
14
+ function dfs(name, path, stack) {
15
+ if (stack.has(name)) {
16
+ const cycleStart = path.indexOf(name);
17
+ const cycleNodes = [...path.slice(cycleStart), name].sort();
18
+ const cycleKey = cycleNodes.join("→");
19
+ if (!cycles.has(cycleKey)) {
20
+ cycles.add(cycleKey);
21
+ errors.push(`Circular [[uses]] detected: ${path.slice(cycleStart).join(" → ")} → ${name}`);
22
+ }
23
+ return;
24
+ }
25
+ if (visited.has(name))
26
+ return;
27
+ visited.add(name);
28
+ stack.add(name);
29
+ const el = elements.get(name);
30
+ if (el) {
31
+ for (const use of el.uses) {
32
+ dfs(use.tag, [...path, name], stack);
33
+ }
34
+ }
35
+ stack.delete(name);
36
+ }
37
+ for (const [name] of elements) {
38
+ if (!name.includes("/")) {
39
+ dfs(name, [], new Set());
40
+ }
41
+ }
42
+ return errors;
43
+ }
44
+ export function detectConflictingReplace(directives) {
45
+ const errors = [];
46
+ const scopeTargets = new Map();
47
+ for (const d of directives) {
48
+ if (!d.scope)
49
+ continue;
50
+ const key = d.scope.value;
51
+ const existing = scopeTargets.get(key);
52
+ if (existing) {
53
+ existing.push(d);
54
+ }
55
+ else {
56
+ scopeTargets.set(key, [d]);
57
+ }
58
+ }
59
+ return errors;
60
+ }
61
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CueDirective, ElementDef } from \"./types.ts\";\n\nexport function validateVersionPin(version: string): string | null {\n\tif (!version) return null;\n\tconst semverRe = /^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.]+)?(\\+[a-zA-Z0-9.]+)?$/;\n\tif (!semverRe.test(version)) {\n\t\treturn `Malformed version pin: '${version}' is not a valid semver range`;\n\t}\n\treturn null;\n}\n\nexport function detectCircularUses(elements: Map<string, ElementDef>): string[] {\n\tconst errors: string[] = [];\n\tconst cycles = new Set<string>();\n\tconst visited = new Set<string>();\n\n\tfunction dfs(name: string, path: string[], stack: Set<string>) {\n\t\tif (stack.has(name)) {\n\t\t\tconst cycleStart = path.indexOf(name);\n\t\t\tconst cycleNodes = [...path.slice(cycleStart), name].sort();\n\t\t\tconst cycleKey = cycleNodes.join(\"→\");\n\t\t\tif (!cycles.has(cycleKey)) {\n\t\t\t\tcycles.add(cycleKey);\n\t\t\t\terrors.push(`Circular [[uses]] detected: ${path.slice(cycleStart).join(\" → \")} → ${name}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (visited.has(name)) return;\n\n\t\tvisited.add(name);\n\t\tstack.add(name);\n\n\t\tconst el = elements.get(name);\n\t\tif (el) {\n\t\t\tfor (const use of el.uses) {\n\t\t\t\tdfs(use.tag, [...path, name], stack);\n\t\t\t}\n\t\t}\n\n\t\tstack.delete(name);\n\t}\n\n\tfor (const [name] of elements) {\n\t\tif (!name.includes(\"/\")) {\n\t\t\tdfs(name, [], new Set());\n\t\t}\n\t}\n\n\treturn errors;\n}\n\nexport function detectConflictingReplace(directives: CueDirective[]): string[] {\n\tconst errors: string[] = [];\n\tconst scopeTargets = new Map<string, CueDirective[]>();\n\n\tfor (const d of directives) {\n\t\tif (!d.scope) continue;\n\t\tconst key = d.scope.value;\n\t\tconst existing = scopeTargets.get(key);\n\t\tif (existing) {\n\t\t\texisting.push(d);\n\t\t} else {\n\t\t\tscopeTargets.set(key, [d]);\n\t\t}\n\t}\n\n\treturn errors;\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@m4ike1/ion-cue",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "files": [
6
+ "dist",
7
+ "README.md"
8
+ ],
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "scripts": {
18
+ "clean": "shx rm -rf dist",
19
+ "build": "tsgo -p tsconfig.build.json",
20
+ "test": "bun test",
21
+ "prepublishOnly": "npm run clean && npm run build"
22
+ }
23
+ }