@oscharko-dev/keiko-contracts 0.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.
Files changed (227) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/bff-wire.d.ts +661 -0
  3. package/dist/bff-wire.d.ts.map +1 -0
  4. package/dist/bff-wire.js +102 -0
  5. package/dist/bug-investigation-events.d.ts +92 -0
  6. package/dist/bug-investigation-events.d.ts.map +1 -0
  7. package/dist/bug-investigation-events.js +18 -0
  8. package/dist/coding-context.d.ts +76 -0
  9. package/dist/coding-context.d.ts.map +1 -0
  10. package/dist/coding-context.js +158 -0
  11. package/dist/connected-context.d.ts +174 -0
  12. package/dist/connected-context.d.ts.map +1 -0
  13. package/dist/connected-context.js +636 -0
  14. package/dist/conversation-budget.d.ts +37 -0
  15. package/dist/conversation-budget.d.ts.map +1 -0
  16. package/dist/conversation-budget.js +97 -0
  17. package/dist/editor-agent.d.ts +131 -0
  18. package/dist/editor-agent.d.ts.map +1 -0
  19. package/dist/editor-agent.js +197 -0
  20. package/dist/editor-completion.d.ts +62 -0
  21. package/dist/editor-completion.d.ts.map +1 -0
  22. package/dist/editor-completion.js +147 -0
  23. package/dist/editor-dirty-close.d.ts +17 -0
  24. package/dist/editor-dirty-close.d.ts.map +1 -0
  25. package/dist/editor-dirty-close.js +8 -0
  26. package/dist/editor-hot-exit.d.ts +18 -0
  27. package/dist/editor-hot-exit.d.ts.map +1 -0
  28. package/dist/editor-hot-exit.js +42 -0
  29. package/dist/editor-inline-completion.d.ts +70 -0
  30. package/dist/editor-inline-completion.d.ts.map +1 -0
  31. package/dist/editor-inline-completion.js +215 -0
  32. package/dist/editor-layout.d.ts +105 -0
  33. package/dist/editor-layout.d.ts.map +1 -0
  34. package/dist/editor-layout.js +479 -0
  35. package/dist/editor-patch-apply.d.ts +77 -0
  36. package/dist/editor-patch-apply.d.ts.map +1 -0
  37. package/dist/editor-patch-apply.js +122 -0
  38. package/dist/editor-session.d.ts +31 -0
  39. package/dist/editor-session.d.ts.map +1 -0
  40. package/dist/editor-session.js +75 -0
  41. package/dist/editor-test-generation.d.ts +104 -0
  42. package/dist/editor-test-generation.d.ts.map +1 -0
  43. package/dist/editor-test-generation.js +211 -0
  44. package/dist/evaluations.d.ts +75 -0
  45. package/dist/evaluations.d.ts.map +1 -0
  46. package/dist/evaluations.js +16 -0
  47. package/dist/evidence.d.ts +297 -0
  48. package/dist/evidence.d.ts.map +1 -0
  49. package/dist/evidence.js +9 -0
  50. package/dist/gateway.d.ts +129 -0
  51. package/dist/gateway.d.ts.map +1 -0
  52. package/dist/gateway.js +66 -0
  53. package/dist/harness.d.ts +274 -0
  54. package/dist/harness.d.ts.map +1 -0
  55. package/dist/harness.js +38 -0
  56. package/dist/index.d.ts +101 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +83 -0
  59. package/dist/language-service.d.ts +145 -0
  60. package/dist/language-service.d.ts.map +1 -0
  61. package/dist/language-service.js +161 -0
  62. package/dist/local-knowledge-large-document-validation.d.ts +7 -0
  63. package/dist/local-knowledge-large-document-validation.d.ts.map +1 -0
  64. package/dist/local-knowledge-large-document-validation.js +161 -0
  65. package/dist/local-knowledge-large-document.d.ts +113 -0
  66. package/dist/local-knowledge-large-document.d.ts.map +1 -0
  67. package/dist/local-knowledge-large-document.js +142 -0
  68. package/dist/local-knowledge-paths.d.ts +3 -0
  69. package/dist/local-knowledge-paths.d.ts.map +1 -0
  70. package/dist/local-knowledge-paths.js +65 -0
  71. package/dist/local-knowledge-records.d.ts +190 -0
  72. package/dist/local-knowledge-records.d.ts.map +1 -0
  73. package/dist/local-knowledge-records.js +36 -0
  74. package/dist/local-knowledge-schema-validation.d.ts +19 -0
  75. package/dist/local-knowledge-schema-validation.d.ts.map +1 -0
  76. package/dist/local-knowledge-schema-validation.js +115 -0
  77. package/dist/local-knowledge-schema.d.ts +14 -0
  78. package/dist/local-knowledge-schema.d.ts.map +1 -0
  79. package/dist/local-knowledge-schema.js +715 -0
  80. package/dist/local-knowledge-validation.d.ts +20 -0
  81. package/dist/local-knowledge-validation.d.ts.map +1 -0
  82. package/dist/local-knowledge-validation.js +487 -0
  83. package/dist/local-knowledge.d.ts +158 -0
  84. package/dist/local-knowledge.d.ts.map +1 -0
  85. package/dist/local-knowledge.js +63 -0
  86. package/dist/memory-audit-events.d.ts +73 -0
  87. package/dist/memory-audit-events.d.ts.map +1 -0
  88. package/dist/memory-audit-events.js +44 -0
  89. package/dist/memory-audit-validation.d.ts +4 -0
  90. package/dist/memory-audit-validation.d.ts.map +1 -0
  91. package/dist/memory-audit-validation.js +151 -0
  92. package/dist/memory-barrel.d.ts +15 -0
  93. package/dist/memory-barrel.d.ts.map +1 -0
  94. package/dist/memory-barrel.js +20 -0
  95. package/dist/memory-internal.d.ts +26 -0
  96. package/dist/memory-internal.d.ts.map +1 -0
  97. package/dist/memory-internal.js +104 -0
  98. package/dist/memory-operations-validation.d.ts +12 -0
  99. package/dist/memory-operations-validation.d.ts.map +1 -0
  100. package/dist/memory-operations-validation.js +267 -0
  101. package/dist/memory-operations.d.ts +156 -0
  102. package/dist/memory-operations.d.ts.map +1 -0
  103. package/dist/memory-operations.js +29 -0
  104. package/dist/memory-record-validation.d.ts +10 -0
  105. package/dist/memory-record-validation.d.ts.map +1 -0
  106. package/dist/memory-record-validation.js +101 -0
  107. package/dist/memory-records.d.ts +66 -0
  108. package/dist/memory-records.d.ts.map +1 -0
  109. package/dist/memory-records.js +22 -0
  110. package/dist/memory-retrieval-validation.d.ts +6 -0
  111. package/dist/memory-retrieval-validation.d.ts.map +1 -0
  112. package/dist/memory-retrieval-validation.js +108 -0
  113. package/dist/memory-validation.d.ts +31 -0
  114. package/dist/memory-validation.d.ts.map +1 -0
  115. package/dist/memory-validation.js +318 -0
  116. package/dist/memory-workflow-port.d.ts +26 -0
  117. package/dist/memory-workflow-port.d.ts.map +1 -0
  118. package/dist/memory-workflow-port.js +13 -0
  119. package/dist/memory.d.ts +81 -0
  120. package/dist/memory.d.ts.map +1 -0
  121. package/dist/memory.js +104 -0
  122. package/dist/prompt-enhancer-analyzer.d.ts +7 -0
  123. package/dist/prompt-enhancer-analyzer.d.ts.map +1 -0
  124. package/dist/prompt-enhancer-analyzer.js +745 -0
  125. package/dist/prompt-enhancer-bff.d.ts +67 -0
  126. package/dist/prompt-enhancer-bff.d.ts.map +1 -0
  127. package/dist/prompt-enhancer-bff.js +156 -0
  128. package/dist/prompt-enhancer-critic.d.ts +46 -0
  129. package/dist/prompt-enhancer-critic.d.ts.map +1 -0
  130. package/dist/prompt-enhancer-critic.js +35 -0
  131. package/dist/prompt-enhancer-grounding.d.ts +19 -0
  132. package/dist/prompt-enhancer-grounding.d.ts.map +1 -0
  133. package/dist/prompt-enhancer-grounding.js +235 -0
  134. package/dist/prompt-enhancer-safety.d.ts +66 -0
  135. package/dist/prompt-enhancer-safety.d.ts.map +1 -0
  136. package/dist/prompt-enhancer-safety.js +446 -0
  137. package/dist/prompt-enhancer-validation.d.ts +28 -0
  138. package/dist/prompt-enhancer-validation.d.ts.map +1 -0
  139. package/dist/prompt-enhancer-validation.js +931 -0
  140. package/dist/prompt-enhancer.d.ts +184 -0
  141. package/dist/prompt-enhancer.d.ts.map +1 -0
  142. package/dist/prompt-enhancer.js +350 -0
  143. package/dist/qualityIntelligence/assertNever.d.ts +2 -0
  144. package/dist/qualityIntelligence/assertNever.d.ts.map +1 -0
  145. package/dist/qualityIntelligence/assertNever.js +7 -0
  146. package/dist/qualityIntelligence/auditSummary.d.ts +25 -0
  147. package/dist/qualityIntelligence/auditSummary.d.ts.map +1 -0
  148. package/dist/qualityIntelligence/auditSummary.js +7 -0
  149. package/dist/qualityIntelligence/bffWire.d.ts +356 -0
  150. package/dist/qualityIntelligence/bffWire.d.ts.map +1 -0
  151. package/dist/qualityIntelligence/bffWire.js +22 -0
  152. package/dist/qualityIntelligence/coverageMap.d.ts +21 -0
  153. package/dist/qualityIntelligence/coverageMap.d.ts.map +1 -0
  154. package/dist/qualityIntelligence/coverageMap.js +29 -0
  155. package/dist/qualityIntelligence/editableRevision.d.ts +21 -0
  156. package/dist/qualityIntelligence/editableRevision.d.ts.map +1 -0
  157. package/dist/qualityIntelligence/editableRevision.js +8 -0
  158. package/dist/qualityIntelligence/evidenceAtom.d.ts +35 -0
  159. package/dist/qualityIntelligence/evidenceAtom.d.ts.map +1 -0
  160. package/dist/qualityIntelligence/evidenceAtom.js +29 -0
  161. package/dist/qualityIntelligence/exportBundle.d.ts +28 -0
  162. package/dist/qualityIntelligence/exportBundle.d.ts.map +1 -0
  163. package/dist/qualityIntelligence/exportBundle.js +46 -0
  164. package/dist/qualityIntelligence/handoffEnvelope.d.ts +23 -0
  165. package/dist/qualityIntelligence/handoffEnvelope.d.ts.map +1 -0
  166. package/dist/qualityIntelligence/handoffEnvelope.js +8 -0
  167. package/dist/qualityIntelligence/ids.d.ts +58 -0
  168. package/dist/qualityIntelligence/ids.d.ts.map +1 -0
  169. package/dist/qualityIntelligence/ids.js +93 -0
  170. package/dist/qualityIntelligence/index.d.ts +29 -0
  171. package/dist/qualityIntelligence/index.d.ts.map +1 -0
  172. package/dist/qualityIntelligence/index.js +20 -0
  173. package/dist/qualityIntelligence/reviewRecord.d.ts +19 -0
  174. package/dist/qualityIntelligence/reviewRecord.d.ts.map +1 -0
  175. package/dist/qualityIntelligence/reviewRecord.js +20 -0
  176. package/dist/qualityIntelligence/runPlanAndEvents.d.ts +84 -0
  177. package/dist/qualityIntelligence/runPlanAndEvents.d.ts.map +1 -0
  178. package/dist/qualityIntelligence/runPlanAndEvents.js +51 -0
  179. package/dist/qualityIntelligence/sourceEnvelope.d.ts +77 -0
  180. package/dist/qualityIntelligence/sourceEnvelope.d.ts.map +1 -0
  181. package/dist/qualityIntelligence/sourceEnvelope.js +118 -0
  182. package/dist/qualityIntelligence/testCaseCandidate.d.ts +21 -0
  183. package/dist/qualityIntelligence/testCaseCandidate.d.ts.map +1 -0
  184. package/dist/qualityIntelligence/testCaseCandidate.js +21 -0
  185. package/dist/qualityIntelligence/testQualityRubric.d.ts +17 -0
  186. package/dist/qualityIntelligence/testQualityRubric.d.ts.map +1 -0
  187. package/dist/qualityIntelligence/testQualityRubric.js +32 -0
  188. package/dist/qualityIntelligence/validationFinding.d.ts +48 -0
  189. package/dist/qualityIntelligence/validationFinding.d.ts.map +1 -0
  190. package/dist/qualityIntelligence/validationFinding.js +36 -0
  191. package/dist/relationships-validation.d.ts +13 -0
  192. package/dist/relationships-validation.d.ts.map +1 -0
  193. package/dist/relationships-validation.js +422 -0
  194. package/dist/relationships.d.ts +79 -0
  195. package/dist/relationships.d.ts.map +1 -0
  196. package/dist/relationships.js +307 -0
  197. package/dist/text-safety.d.ts +7 -0
  198. package/dist/text-safety.d.ts.map +1 -0
  199. package/dist/text-safety.js +58 -0
  200. package/dist/tools.d.ts +153 -0
  201. package/dist/tools.d.ts.map +1 -0
  202. package/dist/tools.js +118 -0
  203. package/dist/unit-test-events.d.ts +87 -0
  204. package/dist/unit-test-events.d.ts.map +1 -0
  205. package/dist/unit-test-events.js +14 -0
  206. package/dist/verification-summary.d.ts +38 -0
  207. package/dist/verification-summary.d.ts.map +1 -0
  208. package/dist/verification-summary.js +5 -0
  209. package/dist/verification.d.ts +64 -0
  210. package/dist/verification.d.ts.map +1 -0
  211. package/dist/verification.js +13 -0
  212. package/dist/workflow-descriptor.d.ts +21 -0
  213. package/dist/workflow-descriptor.d.ts.map +1 -0
  214. package/dist/workflow-descriptor.js +8 -0
  215. package/dist/workflow-handoff.d.ts +69 -0
  216. package/dist/workflow-handoff.d.ts.map +1 -0
  217. package/dist/workflow-handoff.js +381 -0
  218. package/dist/workspace-descriptors.d.ts +21 -0
  219. package/dist/workspace-descriptors.d.ts.map +1 -0
  220. package/dist/workspace-descriptors.js +180 -0
  221. package/dist/workspace-ui.d.ts +119 -0
  222. package/dist/workspace-ui.d.ts.map +1 -0
  223. package/dist/workspace-ui.js +105 -0
  224. package/dist/workspace.d.ts +104 -0
  225. package/dist/workspace.d.ts.map +1 -0
  226. package/dist/workspace.js +27 -0
  227. package/package.json +71 -0
@@ -0,0 +1,97 @@
1
+ // Conversation budget estimator (Issue #151 / Epic #142).
2
+ //
3
+ // Pure, deterministic helper that estimates how much of a chat model's context
4
+ // window is consumed by a conversation turn. The UI uses this for the
5
+ // pre-send pressure indicator (AC#1) and the "clear history" affordance
6
+ // (AC#4). The breakdown carries connected-context byte counts so they can
7
+ // be disclosed and removable from the next call (AC#5).
8
+ //
9
+ // Engineering note (from the issue): token counting is APPROXIMATE here.
10
+ // We use bytes/4 as a rough proxy. UI copy and tests MUST state this
11
+ // precisely — do not present byte estimates as exact tokens.
12
+ // Average ASCII byte ≈ 4 chars per token in mainstream BPE tokenizers. This
13
+ // is an over-simplification; we surface it as APPROXIMATE everywhere.
14
+ const APPROX_BYTES_PER_TOKEN = 4;
15
+ // Pressure thresholds, applied against the fraction of availableInputTokens
16
+ // the approximate token count consumes.
17
+ const PRESSURE_LOW = 0.5;
18
+ const PRESSURE_MODERATE = 0.75;
19
+ const PRESSURE_HIGH = 0.95;
20
+ function coerceNonNegativeInt(value) {
21
+ if (value === undefined)
22
+ return 0;
23
+ if (!Number.isFinite(value))
24
+ return 0;
25
+ if (value <= 0)
26
+ return 0;
27
+ return Math.floor(value);
28
+ }
29
+ function utf8ByteLength(text) {
30
+ // Browsers and Node both expose TextEncoder. Falls back to char length
31
+ // when (in some legacy harness) it is absent — acceptable since the
32
+ // result is documented approximate.
33
+ if (typeof TextEncoder !== "undefined") {
34
+ return new TextEncoder().encode(text).length;
35
+ }
36
+ return text.length;
37
+ }
38
+ function sumHistoryBytes(history) {
39
+ let total = 0;
40
+ for (const message of history) {
41
+ total += utf8ByteLength(message.role);
42
+ total += utf8ByteLength(message.content);
43
+ }
44
+ return total;
45
+ }
46
+ function sumDocumentBytes(documents) {
47
+ if (documents === undefined)
48
+ return 0;
49
+ let total = 0;
50
+ for (const document of documents) {
51
+ total += coerceNonNegativeInt(document.extractedBytes);
52
+ }
53
+ return total;
54
+ }
55
+ function classifyPressure(tokens, availableInputTokens) {
56
+ if (availableInputTokens <= 0)
57
+ return "exceeded";
58
+ const ratio = tokens / availableInputTokens;
59
+ if (ratio > PRESSURE_HIGH)
60
+ return "exceeded";
61
+ if (ratio > PRESSURE_MODERATE)
62
+ return "high";
63
+ if (ratio > PRESSURE_LOW)
64
+ return "moderate";
65
+ return "low";
66
+ }
67
+ export function estimateConversationBudget(input) {
68
+ const contextWindowTokens = coerceNonNegativeInt(input.modelContextWindow);
69
+ const reservedOutputTokens = coerceNonNegativeInt(input.modelMaxOutputTokens);
70
+ const availableInputTokens = Math.max(0, contextWindowTokens - reservedOutputTokens);
71
+ const draftBytes = utf8ByteLength(input.userDraftText);
72
+ const historyBytes = sumHistoryBytes(input.conversationHistory);
73
+ const documentBytes = sumDocumentBytes(input.documentContext);
74
+ const repoContextBytes = coerceNonNegativeInt(input.repoContextPackBytes);
75
+ const knowledgeBytes = coerceNonNegativeInt(input.knowledgeCapsuleBytes);
76
+ const memoryBytes = coerceNonNegativeInt(input.memoryContextBytes);
77
+ const breakdown = {
78
+ draftBytes,
79
+ historyBytes,
80
+ documentBytes,
81
+ repoContextBytes,
82
+ knowledgeBytes,
83
+ memoryBytes,
84
+ };
85
+ const approximateBytes = draftBytes + historyBytes + documentBytes + repoContextBytes + knowledgeBytes + memoryBytes;
86
+ const approximateTokens = Math.ceil(approximateBytes / APPROX_BYTES_PER_TOKEN);
87
+ const pressure = classifyPressure(approximateTokens, availableInputTokens);
88
+ return {
89
+ approximateBytes,
90
+ approximateTokens,
91
+ contextWindowTokens,
92
+ reservedOutputTokens,
93
+ availableInputTokens,
94
+ pressure,
95
+ breakdown,
96
+ };
97
+ }
@@ -0,0 +1,131 @@
1
+ import type { EditorDocumentVersion } from "./editor-session.js";
2
+ import type { LanguageRange } from "./language-service.js";
3
+ export declare const EDITOR_AGENT_SCHEMA_VERSION: "1";
4
+ export type EditorAgentSnapshotTextMode = "none" | "selection" | "activeFile";
5
+ export interface EditorAgentPaneSnapshot {
6
+ readonly paneId: string;
7
+ readonly activeFile: string | null;
8
+ readonly openFiles: readonly string[];
9
+ }
10
+ export interface EditorAgentSessionSnapshot {
11
+ readonly schemaVersion: typeof EDITOR_AGENT_SCHEMA_VERSION;
12
+ readonly sessionId: string;
13
+ readonly windowId: string;
14
+ readonly workspaceRoot: string;
15
+ readonly activePaneId: string | null;
16
+ readonly panes: readonly EditorAgentPaneSnapshot[];
17
+ readonly dirtyFiles: readonly string[];
18
+ readonly activeFile: string | null;
19
+ readonly cursor: {
20
+ readonly line: number;
21
+ readonly character: number;
22
+ } | null;
23
+ readonly selection: LanguageRange | null;
24
+ readonly diagnosticsSummary: {
25
+ readonly errors: number;
26
+ readonly warnings: number;
27
+ readonly infos: number;
28
+ } | null;
29
+ readonly documentVersion?: EditorDocumentVersion | undefined;
30
+ readonly activeFileContentHash?: string | undefined;
31
+ readonly textMode: EditorAgentSnapshotTextMode;
32
+ readonly text?: string | undefined;
33
+ readonly textTruncated?: boolean | undefined;
34
+ readonly updatedAt: number;
35
+ }
36
+ export type EditorAgentActionType = "openFile" | "focusTab" | "moveTab" | "splitPane" | "setSelection" | "format" | "save" | "applyTextEdits" | "applyPatch";
37
+ export interface EditorAgentAction {
38
+ readonly schemaVersion: typeof EDITOR_AGENT_SCHEMA_VERSION;
39
+ readonly actionId: string;
40
+ readonly idempotencyKey: string;
41
+ readonly sessionId: string;
42
+ readonly type: EditorAgentActionType;
43
+ readonly target?: {
44
+ readonly paneId?: string | undefined;
45
+ readonly file?: string | undefined;
46
+ readonly toPaneId?: string | undefined;
47
+ readonly splitDirection?: "row" | "column" | undefined;
48
+ readonly selection?: LanguageRange | undefined;
49
+ } | undefined;
50
+ readonly expectedDocumentVersion?: EditorDocumentVersion | undefined;
51
+ readonly expectedContentHash?: string | undefined;
52
+ readonly textEdits?: readonly {
53
+ readonly range: LanguageRange;
54
+ readonly newText: string;
55
+ }[] | undefined;
56
+ readonly patch?: string | undefined;
57
+ }
58
+ export type EditorAgentActionStatus = "queued" | "succeeded" | "failed" | "conflict";
59
+ export interface EditorAgentActionResult {
60
+ readonly schemaVersion: typeof EDITOR_AGENT_SCHEMA_VERSION;
61
+ readonly actionId: string;
62
+ readonly sessionId: string;
63
+ readonly status: EditorAgentActionStatus;
64
+ readonly message?: string | undefined;
65
+ readonly conflict?: {
66
+ readonly code: "DIRTY" | "VERSION_MISMATCH" | "CONTENT_HASH_MISMATCH" | "NO_ACTIVE_SESSION";
67
+ readonly message: string;
68
+ } | undefined;
69
+ }
70
+ export type EditorAgentEvent = {
71
+ readonly schemaVersion: typeof EDITOR_AGENT_SCHEMA_VERSION;
72
+ readonly eventId: string;
73
+ readonly type: "session";
74
+ readonly snapshot: EditorAgentSessionSnapshot;
75
+ } | {
76
+ readonly schemaVersion: typeof EDITOR_AGENT_SCHEMA_VERSION;
77
+ readonly eventId: string;
78
+ readonly type: "action";
79
+ readonly action: EditorAgentAction;
80
+ } | {
81
+ readonly schemaVersion: typeof EDITOR_AGENT_SCHEMA_VERSION;
82
+ readonly eventId: string;
83
+ readonly type: "result";
84
+ readonly result: EditorAgentActionResult;
85
+ } | {
86
+ readonly schemaVersion: typeof EDITOR_AGENT_SCHEMA_VERSION;
87
+ readonly eventId: string;
88
+ readonly type: "heartbeat";
89
+ readonly updatedAt: number;
90
+ };
91
+ export interface EditorAgentSnapshotRequest {
92
+ readonly schemaVersion: typeof EDITOR_AGENT_SCHEMA_VERSION;
93
+ readonly sessionId?: string | undefined;
94
+ readonly textMode: EditorAgentSnapshotTextMode;
95
+ readonly maxBytes?: number | undefined;
96
+ }
97
+ export interface EditorAgentBridgeSnapshotRequest {
98
+ readonly schemaVersion: typeof EDITOR_AGENT_SCHEMA_VERSION;
99
+ readonly kind: "snapshot";
100
+ readonly snapshot: EditorAgentSessionSnapshot;
101
+ }
102
+ export interface EditorAgentActionResultRequest {
103
+ readonly schemaVersion: typeof EDITOR_AGENT_SCHEMA_VERSION;
104
+ readonly kind: "result";
105
+ readonly result: EditorAgentActionResult;
106
+ }
107
+ export type EditorAgentActionsPostBody = EditorAgentAction | EditorAgentActionResultRequest;
108
+ export interface EditorAgentSessionsResponse {
109
+ readonly sessions: readonly EditorAgentSessionSnapshot[];
110
+ }
111
+ export interface EditorAgentActionQueuedResponse {
112
+ readonly result: EditorAgentActionResult;
113
+ }
114
+ export interface EditorAgentSnapshotResponse {
115
+ readonly snapshot: EditorAgentSessionSnapshot | null;
116
+ }
117
+ export interface EditorAgentParseOk<T> {
118
+ readonly ok: true;
119
+ readonly value: T;
120
+ }
121
+ export interface EditorAgentParseFail {
122
+ readonly ok: false;
123
+ readonly errors: readonly string[];
124
+ }
125
+ export type EditorAgentParse<T> = EditorAgentParseOk<T> | EditorAgentParseFail;
126
+ export declare function isEditorAgentSessionSnapshot(value: unknown): value is EditorAgentSessionSnapshot;
127
+ export declare function isEditorAgentAction(value: unknown): value is EditorAgentAction;
128
+ export declare function isEditorAgentActionResult(value: unknown): value is EditorAgentActionResult;
129
+ export declare function parseEditorAgentSnapshotRequest(value: unknown): EditorAgentParse<EditorAgentSnapshotRequest | EditorAgentBridgeSnapshotRequest>;
130
+ export declare function parseEditorAgentActionsPostBody(value: unknown): EditorAgentParse<EditorAgentActionsPostBody>;
131
+ //# sourceMappingURL=editor-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-agent.d.ts","sourceRoot":"","sources":["../src/editor-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ export const EDITOR_AGENT_SCHEMA_VERSION = "1";
2
+ const EDITOR_AGENT_ACTION_TYPES = [
3
+ "openFile",
4
+ "focusTab",
5
+ "moveTab",
6
+ "splitPane",
7
+ "setSelection",
8
+ "format",
9
+ "save",
10
+ "applyTextEdits",
11
+ "applyPatch",
12
+ ];
13
+ function isRecord(value) {
14
+ return typeof value === "object" && value !== null && !Array.isArray(value);
15
+ }
16
+ function isString(value) {
17
+ return typeof value === "string";
18
+ }
19
+ function isNonEmptyString(value) {
20
+ return typeof value === "string" && value.length > 0;
21
+ }
22
+ function isStringArray(value) {
23
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string");
24
+ }
25
+ function isNonNegativeInteger(value) {
26
+ return typeof value === "number" && Number.isInteger(value) && value >= 0;
27
+ }
28
+ function isSha256Hex(value) {
29
+ return typeof value === "string" && /^[a-f0-9]{64}$/u.test(value);
30
+ }
31
+ function isNullOr(value, guard) {
32
+ return value === null || guard(value);
33
+ }
34
+ function isUndefinedOr(value, guard) {
35
+ return value === undefined || guard(value);
36
+ }
37
+ function isDocumentVersion(value) {
38
+ return (isRecord(value) &&
39
+ isNonNegativeInteger(value.sizeBytes) &&
40
+ isNonNegativeInteger(value.modifiedAt) &&
41
+ isSha256Hex(value.contentHash));
42
+ }
43
+ function isPosition(value) {
44
+ return isRecord(value) && isNonNegativeInteger(value.line) && isNonNegativeInteger(value.character);
45
+ }
46
+ function isRange(value) {
47
+ return isRecord(value) && isPosition(value.start) && isPosition(value.end);
48
+ }
49
+ function isDiagnosticsSummary(value) {
50
+ return (isRecord(value) &&
51
+ isNonNegativeInteger(value.errors) &&
52
+ isNonNegativeInteger(value.warnings) &&
53
+ isNonNegativeInteger(value.infos));
54
+ }
55
+ function isPaneSnapshot(value) {
56
+ return (isRecord(value) &&
57
+ isNonEmptyString(value.paneId) &&
58
+ (value.activeFile === null || typeof value.activeFile === "string") &&
59
+ isStringArray(value.openFiles));
60
+ }
61
+ function isSnapshotTextMode(value) {
62
+ return value === "none" || value === "selection" || value === "activeFile";
63
+ }
64
+ function isPaneSnapshotArray(value) {
65
+ return Array.isArray(value) && value.every(isPaneSnapshot);
66
+ }
67
+ export function isEditorAgentSessionSnapshot(value) {
68
+ if (!isRecord(value))
69
+ return false;
70
+ return [
71
+ value.schemaVersion === EDITOR_AGENT_SCHEMA_VERSION,
72
+ isNonEmptyString(value.sessionId),
73
+ isNonEmptyString(value.windowId),
74
+ isNonEmptyString(value.workspaceRoot),
75
+ isNullOr(value.activePaneId, isString),
76
+ isPaneSnapshotArray(value.panes),
77
+ isStringArray(value.dirtyFiles),
78
+ isNullOr(value.activeFile, isString),
79
+ isNullOr(value.cursor, isPosition),
80
+ isNullOr(value.selection, isRange),
81
+ isNullOr(value.diagnosticsSummary, isDiagnosticsSummary),
82
+ isUndefinedOr(value.documentVersion, isDocumentVersion),
83
+ isUndefinedOr(value.activeFileContentHash, isSha256Hex),
84
+ isSnapshotTextMode(value.textMode),
85
+ isUndefinedOr(value.text, isString),
86
+ isUndefinedOr(value.textTruncated, (candidate) => typeof candidate === "boolean"),
87
+ isNonNegativeInteger(value.updatedAt),
88
+ ].every(Boolean);
89
+ }
90
+ function isActionType(value) {
91
+ return typeof value === "string" && EDITOR_AGENT_ACTION_TYPES.includes(value);
92
+ }
93
+ function isSplitDirection(value) {
94
+ return value === "row" || value === "column";
95
+ }
96
+ function isActionTarget(value) {
97
+ if (value === undefined)
98
+ return true;
99
+ if (!isRecord(value))
100
+ return false;
101
+ return [
102
+ isUndefinedOr(value.paneId, isString),
103
+ isUndefinedOr(value.file, isString),
104
+ isUndefinedOr(value.toPaneId, isString),
105
+ isUndefinedOr(value.splitDirection, isSplitDirection),
106
+ isUndefinedOr(value.selection, isRange),
107
+ ].every(Boolean);
108
+ }
109
+ function isTextEdit(value) {
110
+ return isRecord(value) && isRange(value.range) && typeof value.newText === "string";
111
+ }
112
+ function isTextEditArray(value) {
113
+ return Array.isArray(value) && value.every(isTextEdit);
114
+ }
115
+ export function isEditorAgentAction(value) {
116
+ if (!isRecord(value))
117
+ return false;
118
+ return [
119
+ value.schemaVersion === EDITOR_AGENT_SCHEMA_VERSION,
120
+ isNonEmptyString(value.actionId),
121
+ isNonEmptyString(value.idempotencyKey),
122
+ isNonEmptyString(value.sessionId),
123
+ isActionType(value.type),
124
+ isActionTarget(value.target),
125
+ isUndefinedOr(value.expectedDocumentVersion, isDocumentVersion),
126
+ isUndefinedOr(value.expectedContentHash, isSha256Hex),
127
+ isUndefinedOr(value.textEdits, isTextEditArray),
128
+ isUndefinedOr(value.patch, isString),
129
+ ].every(Boolean);
130
+ }
131
+ function isActionStatus(value) {
132
+ return value === "queued" || value === "succeeded" || value === "failed" || value === "conflict";
133
+ }
134
+ export function isEditorAgentActionResult(value) {
135
+ return (isRecord(value) &&
136
+ value.schemaVersion === EDITOR_AGENT_SCHEMA_VERSION &&
137
+ isNonEmptyString(value.actionId) &&
138
+ isNonEmptyString(value.sessionId) &&
139
+ isActionStatus(value.status) &&
140
+ (value.message === undefined || typeof value.message === "string"));
141
+ }
142
+ function parseBridgeSnapshotRequest(value) {
143
+ if (!isEditorAgentSessionSnapshot(value.snapshot)) {
144
+ return { ok: false, errors: ["snapshot must be a valid editor agent session snapshot"] };
145
+ }
146
+ return {
147
+ ok: true,
148
+ value: {
149
+ schemaVersion: EDITOR_AGENT_SCHEMA_VERSION,
150
+ kind: "snapshot",
151
+ snapshot: value.snapshot,
152
+ },
153
+ };
154
+ }
155
+ function parseReadSnapshotRequest(value) {
156
+ if (value.schemaVersion !== EDITOR_AGENT_SCHEMA_VERSION) {
157
+ return { ok: false, errors: ["schemaVersion must be 1"] };
158
+ }
159
+ if (!isSnapshotTextMode(value.textMode)) {
160
+ return { ok: false, errors: ["textMode must be none, selection, or activeFile"] };
161
+ }
162
+ if (value.sessionId !== undefined && typeof value.sessionId !== "string") {
163
+ return { ok: false, errors: ["sessionId must be a string when present"] };
164
+ }
165
+ if (value.maxBytes !== undefined && !isNonNegativeInteger(value.maxBytes)) {
166
+ return { ok: false, errors: ["maxBytes must be a non-negative integer when present"] };
167
+ }
168
+ return {
169
+ ok: true,
170
+ value: {
171
+ schemaVersion: EDITOR_AGENT_SCHEMA_VERSION,
172
+ ...(value.sessionId === undefined ? {} : { sessionId: value.sessionId }),
173
+ textMode: value.textMode,
174
+ ...(value.maxBytes === undefined ? {} : { maxBytes: value.maxBytes }),
175
+ },
176
+ };
177
+ }
178
+ export function parseEditorAgentSnapshotRequest(value) {
179
+ if (!isRecord(value))
180
+ return { ok: false, errors: ["request must be an object"] };
181
+ return value.kind === "snapshot" ? parseBridgeSnapshotRequest(value) : parseReadSnapshotRequest(value);
182
+ }
183
+ export function parseEditorAgentActionsPostBody(value) {
184
+ if (isEditorAgentAction(value))
185
+ return { ok: true, value };
186
+ if (isRecord(value) && value.kind === "result" && isEditorAgentActionResult(value.result)) {
187
+ return {
188
+ ok: true,
189
+ value: {
190
+ schemaVersion: EDITOR_AGENT_SCHEMA_VERSION,
191
+ kind: "result",
192
+ result: value.result,
193
+ },
194
+ };
195
+ }
196
+ return { ok: false, errors: ["body must be an editor agent action or action result"] };
197
+ }
@@ -0,0 +1,62 @@
1
+ import { type LanguageCompletionItemKind, type LanguageDocumentOverlay, type LanguagePosition } from "./language-service.js";
2
+ import type { CompletionDegradeReason, CompletionInteractionMode, CostClass } from "./gateway.js";
3
+ export declare const EDITOR_COMPLETION_SCHEMA_VERSION: "1";
4
+ export type EditorCompletionWireTriggerKind = "invoked" | "trigger-character" | "incomplete";
5
+ export declare const EDITOR_COMPLETION_WIRE_TRIGGER_KINDS: readonly EditorCompletionWireTriggerKind[];
6
+ export type EditorCompletionItemOrigin = "deterministic" | "model-assisted";
7
+ export declare const EDITOR_COMPLETION_ITEM_ORIGINS: readonly EditorCompletionItemOrigin[];
8
+ export interface EditorCompletionWireItem {
9
+ readonly label: string;
10
+ readonly kind: LanguageCompletionItemKind;
11
+ readonly insertText: string;
12
+ readonly detail?: string;
13
+ readonly sortText?: string;
14
+ readonly origin: EditorCompletionItemOrigin;
15
+ }
16
+ export type EditorCompletionSource = "deterministic-language-service" | "model-assisted" | "repository-context" | "local-knowledge" | "memory" | "connected-context";
17
+ export declare const EDITOR_COMPLETION_SOURCES: readonly EditorCompletionSource[];
18
+ export interface EditorCompletionWireProvenance {
19
+ readonly sources: readonly EditorCompletionSource[];
20
+ readonly modelMode: CompletionInteractionMode;
21
+ readonly modelId?: string;
22
+ readonly latencyClass?: string;
23
+ readonly degradeReason?: CompletionDegradeReason;
24
+ readonly gatewayPolicyVersion?: string;
25
+ readonly promptHash?: string;
26
+ }
27
+ export interface EditorCompletionWireResponse {
28
+ readonly schemaVersion: typeof EDITOR_COMPLETION_SCHEMA_VERSION;
29
+ readonly items: readonly EditorCompletionWireItem[];
30
+ readonly isIncomplete: boolean;
31
+ readonly truncated: boolean;
32
+ readonly provenance: EditorCompletionWireProvenance;
33
+ }
34
+ export interface EditorCompletionContextSelectors {
35
+ readonly queryText?: string;
36
+ readonly symbol?: string;
37
+ readonly changedFiles?: readonly string[];
38
+ readonly capsuleId?: string;
39
+ readonly capsuleSetId?: string;
40
+ }
41
+ export interface EditorCompletionWireRequest {
42
+ readonly schemaVersion: typeof EDITOR_COMPLETION_SCHEMA_VERSION;
43
+ readonly root: string;
44
+ readonly document: LanguageDocumentOverlay;
45
+ readonly position: LanguagePosition;
46
+ readonly triggerKind: EditorCompletionWireTriggerKind;
47
+ readonly triggerCharacter?: string;
48
+ readonly contextBudgetBytes: number;
49
+ readonly context?: EditorCompletionContextSelectors;
50
+ readonly maxCostClass?: CostClass;
51
+ }
52
+ export interface EditorCompletionParseOk {
53
+ readonly ok: true;
54
+ readonly value: EditorCompletionWireRequest;
55
+ }
56
+ export interface EditorCompletionParseFail {
57
+ readonly ok: false;
58
+ readonly errors: readonly string[];
59
+ }
60
+ export type EditorCompletionParse = EditorCompletionParseOk | EditorCompletionParseFail;
61
+ export declare function parseEditorCompletionRequest(value: unknown): EditorCompletionParse;
62
+ //# sourceMappingURL=editor-completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-completion.d.ts","sourceRoot":"","sources":["../src/editor-completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ // Editor completion-gateway WIRE contract (Issue #1199, Epic #1189, ADR-0042 D4/D5/D6). These are
2
+ // the request/response shapes the `POST /api/editor/completion` BFF route consumes and emits. The
3
+ // route is the governed seam between the browser-tier `@oscharko-dev/keiko-editor` Monaco completion
4
+ // provider (which renders only) and the server-owned completion sources: the deterministic
5
+ // language service (#1198), governed coding-context retrieval (#1211), and — only when an aligned,
6
+ // in-budget infilling model is configured (#1210) — model-assisted completion routed through the
7
+ // Model Gateway.
8
+ //
9
+ // Content boundary: the REQUEST necessarily carries the in-editor buffer text (the overlay the
10
+ // language service analyses), exactly like the language-service request (#1198) — it is the user's
11
+ // own buffer travelling over the loopback BFF, never logged. The RESPONSE is content-free apart from
12
+ // `insertText`, which is the reviewable code artifact the user accepts into their own buffer: no raw
13
+ // prompt, no raw model reasoning, no retrieved excerpt, no secret. Provenance carries only ids,
14
+ // hashes, enum literals, and counts (EU AI Act Reg. (EU) 2024/1689 Art. 12 record-keeping).
15
+ //
16
+ // Leaf-package rules (ADR-0019): pure types and frozen const tables plus throw-free validators only.
17
+ // No filesystem, no clock, no crypto, no randomness, and no imports of other `@oscharko-dev/keiko-*`
18
+ // packages. The item-kind set is reused from the language-service contract so the editor renders one
19
+ // stable icon set across deterministic and model-assisted items.
20
+ import { isLanguageDocumentOverlay, isLanguagePosition, } from "./language-service.js";
21
+ // Schema version for the completion-gateway envelope. Bump as a new string member when the shape
22
+ // changes incompatibly; consumers pin against the literal to detect skew.
23
+ export const EDITOR_COMPLETION_SCHEMA_VERSION = "1";
24
+ export const EDITOR_COMPLETION_WIRE_TRIGGER_KINDS = [
25
+ "invoked",
26
+ "trigger-character",
27
+ "incomplete",
28
+ ];
29
+ export const EDITOR_COMPLETION_ITEM_ORIGINS = [
30
+ "deterministic",
31
+ "model-assisted",
32
+ ];
33
+ export const EDITOR_COMPLETION_SOURCES = [
34
+ "deterministic-language-service",
35
+ "model-assisted",
36
+ "repository-context",
37
+ "local-knowledge",
38
+ "memory",
39
+ "connected-context",
40
+ ];
41
+ function isRecord(value) {
42
+ return typeof value === "object" && value !== null && !Array.isArray(value);
43
+ }
44
+ function isNonEmptyString(value) {
45
+ return typeof value === "string" && value.length > 0;
46
+ }
47
+ function isNonNegativeInteger(value) {
48
+ return typeof value === "number" && Number.isInteger(value) && value >= 0;
49
+ }
50
+ function isWireTriggerKind(value) {
51
+ return (typeof value === "string" &&
52
+ EDITOR_COMPLETION_WIRE_TRIGGER_KINDS.includes(value));
53
+ }
54
+ function isCostClass(value) {
55
+ return value === "low" || value === "medium" || value === "high";
56
+ }
57
+ function isStringArray(value) {
58
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string");
59
+ }
60
+ // Collects the optional, content-bearing context selectors. Unknown-typed fields are rejected so a
61
+ // malformed selector cannot silently widen retrieval; an absent `context` is valid (deterministic +
62
+ // repo-search only).
63
+ function collectContextErrors(context, errors) {
64
+ if (context === undefined) {
65
+ return;
66
+ }
67
+ if (!isRecord(context)) {
68
+ errors.push("context must be an object when provided");
69
+ return;
70
+ }
71
+ for (const field of ["queryText", "symbol", "capsuleId", "capsuleSetId"]) {
72
+ if (context[field] !== undefined && typeof context[field] !== "string") {
73
+ errors.push(`context.${field} must be a string when provided`);
74
+ }
75
+ }
76
+ if (context.changedFiles !== undefined && !isStringArray(context.changedFiles)) {
77
+ errors.push("context.changedFiles must be an array of strings when provided");
78
+ }
79
+ if (context.capsuleId !== undefined && context.capsuleSetId !== undefined) {
80
+ errors.push("context must not set both capsuleId and capsuleSetId");
81
+ }
82
+ }
83
+ function buildContextSelectors(context) {
84
+ return {
85
+ ...(typeof context.queryText === "string" ? { queryText: context.queryText } : {}),
86
+ ...(typeof context.symbol === "string" ? { symbol: context.symbol } : {}),
87
+ ...(isStringArray(context.changedFiles) ? { changedFiles: context.changedFiles } : {}),
88
+ ...(typeof context.capsuleId === "string" ? { capsuleId: context.capsuleId } : {}),
89
+ ...(typeof context.capsuleSetId === "string" ? { capsuleSetId: context.capsuleSetId } : {}),
90
+ };
91
+ }
92
+ // Collects every field-level invariant error in fixed order (kept separate from the assembly step so
93
+ // the parser entry point stays low-complexity).
94
+ function collectRequestErrors(value) {
95
+ const errors = [];
96
+ if (!isNonEmptyString(value.root)) {
97
+ errors.push("root must be a non-empty string");
98
+ }
99
+ if (!isLanguageDocumentOverlay(value.document)) {
100
+ errors.push("document must be { path, languageId, text }");
101
+ }
102
+ if (!isLanguagePosition(value.position)) {
103
+ errors.push("position must be { line, character }");
104
+ }
105
+ if (!isWireTriggerKind(value.triggerKind)) {
106
+ errors.push(`triggerKind must be one of: ${EDITOR_COMPLETION_WIRE_TRIGGER_KINDS.join(", ")}`);
107
+ }
108
+ if (value.triggerCharacter !== undefined && typeof value.triggerCharacter !== "string") {
109
+ errors.push("triggerCharacter must be a string when provided");
110
+ }
111
+ if (!isNonNegativeInteger(value.contextBudgetBytes)) {
112
+ errors.push("contextBudgetBytes must be a non-negative integer");
113
+ }
114
+ if (value.maxCostClass !== undefined && !isCostClass(value.maxCostClass)) {
115
+ errors.push("maxCostClass must be one of: low, medium, high");
116
+ }
117
+ collectContextErrors(value.context, errors);
118
+ return errors;
119
+ }
120
+ // Validates an `unknown` payload into an EditorCompletionWireRequest, reporting one error per failed
121
+ // invariant. The BFF uses this to reject a malformed request with 400 INVALID_REQUEST.
122
+ export function parseEditorCompletionRequest(value) {
123
+ if (!isRecord(value)) {
124
+ return { ok: false, errors: ["request must be an object"] };
125
+ }
126
+ const errors = collectRequestErrors(value);
127
+ if (errors.length > 0) {
128
+ return { ok: false, errors };
129
+ }
130
+ const context = isRecord(value.context) ? buildContextSelectors(value.context) : undefined;
131
+ return {
132
+ ok: true,
133
+ value: {
134
+ schemaVersion: EDITOR_COMPLETION_SCHEMA_VERSION,
135
+ root: value.root,
136
+ document: value.document,
137
+ position: value.position,
138
+ triggerKind: value.triggerKind,
139
+ ...(typeof value.triggerCharacter === "string"
140
+ ? { triggerCharacter: value.triggerCharacter }
141
+ : {}),
142
+ contextBudgetBytes: value.contextBudgetBytes,
143
+ ...(context !== undefined && Object.keys(context).length > 0 ? { context } : {}),
144
+ ...(isCostClass(value.maxCostClass) ? { maxCostClass: value.maxCostClass } : {}),
145
+ },
146
+ };
147
+ }
@@ -0,0 +1,17 @@
1
+ export type EditorDirtyCloseReason = "tab-close" | "pane-close" | "root-change" | "window-close" | "reload-file";
2
+ export interface EditorDirtyCloseIntent {
3
+ readonly paneId: string;
4
+ readonly files: readonly string[];
5
+ readonly reason: EditorDirtyCloseReason;
6
+ }
7
+ export type EditorDirtyCloseDecision = "save" | "discard" | "cancel";
8
+ export interface EditorDirtyCloseResolution {
9
+ readonly decision: EditorDirtyCloseDecision;
10
+ readonly files: readonly string[];
11
+ }
12
+ export declare function createEditorDirtyCloseIntent(input: {
13
+ readonly paneId: string;
14
+ readonly files: readonly string[];
15
+ readonly reason: EditorDirtyCloseReason;
16
+ }): EditorDirtyCloseIntent;
17
+ //# sourceMappingURL=editor-dirty-close.d.ts.map