@galaxy-stack/ai-coder-core 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 (197) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +131 -0
  3. package/dist/approval/approval-policy.d.ts +31 -0
  4. package/dist/approval/approval-policy.d.ts.map +1 -0
  5. package/dist/approval/approval-policy.js +179 -0
  6. package/dist/approval/approval-policy.js.map +1 -0
  7. package/dist/approval/index.d.ts +2 -0
  8. package/dist/approval/index.d.ts.map +1 -0
  9. package/dist/approval/index.js +2 -0
  10. package/dist/approval/index.js.map +1 -0
  11. package/dist/context/attachment-types.d.ts +35 -0
  12. package/dist/context/attachment-types.d.ts.map +1 -0
  13. package/dist/context/attachment-types.js +9 -0
  14. package/dist/context/attachment-types.js.map +1 -0
  15. package/dist/context/checkpoint.d.ts +194 -0
  16. package/dist/context/checkpoint.d.ts.map +1 -0
  17. package/dist/context/checkpoint.js +921 -0
  18. package/dist/context/checkpoint.js.map +1 -0
  19. package/dist/context/context-manager.d.ts +153 -0
  20. package/dist/context/context-manager.d.ts.map +1 -0
  21. package/dist/context/context-manager.js +541 -0
  22. package/dist/context/context-manager.js.map +1 -0
  23. package/dist/context/context-profile.d.ts +42 -0
  24. package/dist/context/context-profile.d.ts.map +1 -0
  25. package/dist/context/context-profile.js +102 -0
  26. package/dist/context/context-profile.js.map +1 -0
  27. package/dist/context/index.d.ts +7 -0
  28. package/dist/context/index.d.ts.map +1 -0
  29. package/dist/context/index.js +7 -0
  30. package/dist/context/index.js.map +1 -0
  31. package/dist/context/token-ledger.d.ts +102 -0
  32. package/dist/context/token-ledger.d.ts.map +1 -0
  33. package/dist/context/token-ledger.js +205 -0
  34. package/dist/context/token-ledger.js.map +1 -0
  35. package/dist/context/tool-output.d.ts +46 -0
  36. package/dist/context/tool-output.d.ts.map +1 -0
  37. package/dist/context/tool-output.js +82 -0
  38. package/dist/context/tool-output.js.map +1 -0
  39. package/dist/deterministic-order.d.ts +3 -0
  40. package/dist/deterministic-order.d.ts.map +1 -0
  41. package/dist/deterministic-order.js +5 -0
  42. package/dist/deterministic-order.js.map +1 -0
  43. package/dist/index.d.ts +19 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +19 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/ports/approval-port.d.ts +29 -0
  48. package/dist/ports/approval-port.d.ts.map +1 -0
  49. package/dist/ports/approval-port.js +9 -0
  50. package/dist/ports/approval-port.js.map +1 -0
  51. package/dist/ports/artifact-port.d.ts +66 -0
  52. package/dist/ports/artifact-port.d.ts.map +1 -0
  53. package/dist/ports/artifact-port.js +9 -0
  54. package/dist/ports/artifact-port.js.map +1 -0
  55. package/dist/ports/capability-port.d.ts +62 -0
  56. package/dist/ports/capability-port.d.ts.map +1 -0
  57. package/dist/ports/capability-port.js +9 -0
  58. package/dist/ports/capability-port.js.map +1 -0
  59. package/dist/ports/coding-model-port.d.ts +12 -0
  60. package/dist/ports/coding-model-port.d.ts.map +1 -0
  61. package/dist/ports/coding-model-port.js +9 -0
  62. package/dist/ports/coding-model-port.js.map +1 -0
  63. package/dist/ports/command-port.d.ts +94 -0
  64. package/dist/ports/command-port.d.ts.map +1 -0
  65. package/dist/ports/command-port.js +9 -0
  66. package/dist/ports/command-port.js.map +1 -0
  67. package/dist/ports/execution-context.d.ts +30 -0
  68. package/dist/ports/execution-context.d.ts.map +1 -0
  69. package/dist/ports/execution-context.js +11 -0
  70. package/dist/ports/execution-context.js.map +1 -0
  71. package/dist/ports/git-port.d.ts +27 -0
  72. package/dist/ports/git-port.d.ts.map +1 -0
  73. package/dist/ports/git-port.js +9 -0
  74. package/dist/ports/git-port.js.map +1 -0
  75. package/dist/ports/host-adapter.d.ts +36 -0
  76. package/dist/ports/host-adapter.d.ts.map +1 -0
  77. package/dist/ports/host-adapter.js +9 -0
  78. package/dist/ports/host-adapter.js.map +1 -0
  79. package/dist/ports/index.d.ts +16 -0
  80. package/dist/ports/index.d.ts.map +1 -0
  81. package/dist/ports/index.js +16 -0
  82. package/dist/ports/index.js.map +1 -0
  83. package/dist/ports/pagination.d.ts +17 -0
  84. package/dist/ports/pagination.d.ts.map +1 -0
  85. package/dist/ports/pagination.js +9 -0
  86. package/dist/ports/pagination.js.map +1 -0
  87. package/dist/ports/persistence-port.d.ts +59 -0
  88. package/dist/ports/persistence-port.d.ts.map +1 -0
  89. package/dist/ports/persistence-port.js +9 -0
  90. package/dist/ports/persistence-port.js.map +1 -0
  91. package/dist/ports/port-result.d.ts +29 -0
  92. package/dist/ports/port-result.d.ts.map +1 -0
  93. package/dist/ports/port-result.js +20 -0
  94. package/dist/ports/port-result.js.map +1 -0
  95. package/dist/ports/preview-port.d.ts +27 -0
  96. package/dist/ports/preview-port.d.ts.map +1 -0
  97. package/dist/ports/preview-port.js +9 -0
  98. package/dist/ports/preview-port.js.map +1 -0
  99. package/dist/ports/research-port.d.ts +40 -0
  100. package/dist/ports/research-port.d.ts.map +1 -0
  101. package/dist/ports/research-port.js +9 -0
  102. package/dist/ports/research-port.js.map +1 -0
  103. package/dist/ports/trace-port.d.ts +26 -0
  104. package/dist/ports/trace-port.d.ts.map +1 -0
  105. package/dist/ports/trace-port.js +9 -0
  106. package/dist/ports/trace-port.js.map +1 -0
  107. package/dist/ports/workspace-port.d.ts +126 -0
  108. package/dist/ports/workspace-port.d.ts.map +1 -0
  109. package/dist/ports/workspace-port.js +9 -0
  110. package/dist/ports/workspace-port.js.map +1 -0
  111. package/dist/prompt/index.d.ts +2 -0
  112. package/dist/prompt/index.d.ts.map +1 -0
  113. package/dist/prompt/index.js +2 -0
  114. package/dist/prompt/index.js.map +1 -0
  115. package/dist/prompt/prompt-assembler.d.ts +114 -0
  116. package/dist/prompt/prompt-assembler.d.ts.map +1 -0
  117. package/dist/prompt/prompt-assembler.js +363 -0
  118. package/dist/prompt/prompt-assembler.js.map +1 -0
  119. package/dist/retrieval/evidence.d.ts +41 -0
  120. package/dist/retrieval/evidence.d.ts.map +1 -0
  121. package/dist/retrieval/evidence.js +48 -0
  122. package/dist/retrieval/evidence.js.map +1 -0
  123. package/dist/retrieval/index.d.ts +4 -0
  124. package/dist/retrieval/index.d.ts.map +1 -0
  125. package/dist/retrieval/index.js +4 -0
  126. package/dist/retrieval/index.js.map +1 -0
  127. package/dist/retrieval/lexical-retriever.d.ts +56 -0
  128. package/dist/retrieval/lexical-retriever.d.ts.map +1 -0
  129. package/dist/retrieval/lexical-retriever.js +128 -0
  130. package/dist/retrieval/lexical-retriever.js.map +1 -0
  131. package/dist/retrieval/retrieval-policy.d.ts +25 -0
  132. package/dist/retrieval/retrieval-policy.d.ts.map +1 -0
  133. package/dist/retrieval/retrieval-policy.js +71 -0
  134. package/dist/retrieval/retrieval-policy.js.map +1 -0
  135. package/dist/runtime/completion-gate.d.ts +75 -0
  136. package/dist/runtime/completion-gate.d.ts.map +1 -0
  137. package/dist/runtime/completion-gate.js +114 -0
  138. package/dist/runtime/completion-gate.js.map +1 -0
  139. package/dist/runtime/index.d.ts +7 -0
  140. package/dist/runtime/index.d.ts.map +1 -0
  141. package/dist/runtime/index.js +7 -0
  142. package/dist/runtime/index.js.map +1 -0
  143. package/dist/runtime/run-controller.d.ts +55 -0
  144. package/dist/runtime/run-controller.d.ts.map +1 -0
  145. package/dist/runtime/run-controller.js +2673 -0
  146. package/dist/runtime/run-controller.js.map +1 -0
  147. package/dist/runtime/runtime-error.d.ts +7 -0
  148. package/dist/runtime/runtime-error.d.ts.map +1 -0
  149. package/dist/runtime/runtime-error.js +11 -0
  150. package/dist/runtime/runtime-error.js.map +1 -0
  151. package/dist/runtime/runtime-types.d.ts +303 -0
  152. package/dist/runtime/runtime-types.d.ts.map +1 -0
  153. package/dist/runtime/runtime-types.js +2 -0
  154. package/dist/runtime/runtime-types.js.map +1 -0
  155. package/dist/runtime/state-machine.d.ts +27 -0
  156. package/dist/runtime/state-machine.d.ts.map +1 -0
  157. package/dist/runtime/state-machine.js +68 -0
  158. package/dist/runtime/state-machine.js.map +1 -0
  159. package/dist/runtime/trace-emitter.d.ts +17 -0
  160. package/dist/runtime/trace-emitter.d.ts.map +1 -0
  161. package/dist/runtime/trace-emitter.js +91 -0
  162. package/dist/runtime/trace-emitter.js.map +1 -0
  163. package/dist/tools/coding-messages.d.ts +112 -0
  164. package/dist/tools/coding-messages.d.ts.map +1 -0
  165. package/dist/tools/coding-messages.js +20 -0
  166. package/dist/tools/coding-messages.js.map +1 -0
  167. package/dist/tools/index.d.ts +7 -0
  168. package/dist/tools/index.d.ts.map +1 -0
  169. package/dist/tools/index.js +7 -0
  170. package/dist/tools/index.js.map +1 -0
  171. package/dist/tools/json-schema.d.ts +18 -0
  172. package/dist/tools/json-schema.d.ts.map +1 -0
  173. package/dist/tools/json-schema.js +299 -0
  174. package/dist/tools/json-schema.js.map +1 -0
  175. package/dist/tools/settings-types.d.ts +41 -0
  176. package/dist/tools/settings-types.d.ts.map +1 -0
  177. package/dist/tools/settings-types.js +88 -0
  178. package/dist/tools/settings-types.js.map +1 -0
  179. package/dist/tools/tool-effect-profile.d.ts +44 -0
  180. package/dist/tools/tool-effect-profile.d.ts.map +1 -0
  181. package/dist/tools/tool-effect-profile.js +157 -0
  182. package/dist/tools/tool-effect-profile.js.map +1 -0
  183. package/dist/tools/tool-registry-types.d.ts +72 -0
  184. package/dist/tools/tool-registry-types.d.ts.map +1 -0
  185. package/dist/tools/tool-registry-types.js +9 -0
  186. package/dist/tools/tool-registry-types.js.map +1 -0
  187. package/dist/tools/tool-registry.d.ts +155 -0
  188. package/dist/tools/tool-registry.d.ts.map +1 -0
  189. package/dist/tools/tool-registry.js +599 -0
  190. package/dist/tools/tool-registry.js.map +1 -0
  191. package/dist/tools/tool-registry.schema.json +144 -0
  192. package/docs/ARCHITECTURE.md +259 -0
  193. package/docs/HOST_CONFORMANCE.md +210 -0
  194. package/docs/PROMPT_CONTRACT.md +123 -0
  195. package/docs/TOOL_EFFECT_PROFILE.md +77 -0
  196. package/docs/TOOL_REGISTRY_COMPARISON.md +358 -0
  197. package/package.json +76 -0
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @author Bùi Trọng Hiếu
3
+ * @email kevinbui210191@gmail.com
4
+ * @create date 2026-08-21
5
+ * @modify date 2026-08-21
6
+ * @desc Versioned context profile configs (conservative/balanced/extended) and pressure classification. Budgets derive from ModelCapabilities and calibrated safety rate.
7
+ */
8
+ export const AI_CODER_CONTEXT_PROFILE_SCHEMA_VERSION = 1;
9
+ export const AI_CODER_CONTEXT_PROFILE_CONFIG_VERSION = "1.0.0";
10
+ const PROFILE_CONFIGS = Object.freeze({
11
+ conservative: Object.freeze({
12
+ compactionThreshold: 150_000,
13
+ configVersion: AI_CODER_CONTEXT_PROFILE_CONFIG_VERSION,
14
+ evictionThreshold: 120_000,
15
+ maxToolRoundsBeforeCheckpoint: 16,
16
+ name: "conservative",
17
+ outputReserveTokens: 24_000,
18
+ schemaVersion: AI_CODER_CONTEXT_PROFILE_SCHEMA_VERSION,
19
+ softInputTokens: 120_000,
20
+ tightenThreshold: 90_000,
21
+ toolDefinitionBudget: 8_000,
22
+ }),
23
+ balanced: Object.freeze({
24
+ compactionThreshold: 190_000,
25
+ configVersion: AI_CODER_CONTEXT_PROFILE_CONFIG_VERSION,
26
+ evictionThreshold: 160_000,
27
+ maxToolRoundsBeforeCheckpoint: 24,
28
+ name: "balanced",
29
+ outputReserveTokens: 32_768,
30
+ schemaVersion: AI_CODER_CONTEXT_PROFILE_SCHEMA_VERSION,
31
+ softInputTokens: 160_000,
32
+ tightenThreshold: 120_000,
33
+ toolDefinitionBudget: 10_000,
34
+ }),
35
+ extended: Object.freeze({
36
+ compactionThreshold: 210_000,
37
+ configVersion: AI_CODER_CONTEXT_PROFILE_CONFIG_VERSION,
38
+ evictionThreshold: 190_000,
39
+ maxToolRoundsBeforeCheckpoint: 32,
40
+ name: "extended",
41
+ outputReserveTokens: 32_768,
42
+ schemaVersion: AI_CODER_CONTEXT_PROFILE_SCHEMA_VERSION,
43
+ softInputTokens: 190_000,
44
+ tightenThreshold: 160_000,
45
+ toolDefinitionBudget: 16_000,
46
+ }),
47
+ });
48
+ export function aiCoderContextProfile(name) {
49
+ return PROFILE_CONFIGS[name];
50
+ }
51
+ export function resolveAiCoderContextBudget(name, capabilities, hasCalibratedProviderUsage = false) {
52
+ const profile = aiCoderContextProfile(name);
53
+ const fallbackContextWindow = !capabilities.contextWindow;
54
+ const contextWindow = capabilities.contextWindow ?? 65_536;
55
+ const safetyRate = hasCalibratedProviderUsage ? 0.05 : 0.10;
56
+ const safetyReserveTokens = Math.max(8_192, Math.ceil(contextWindow * safetyRate));
57
+ const outputReserveTokens = Math.min(profile.outputReserveTokens, Math.floor(contextWindow * 0.5));
58
+ const hardInputTokens = Math.max(1, contextWindow - outputReserveTokens - safetyReserveTokens);
59
+ // Small-context deployments must retain room between their operating target and
60
+ // hard ceiling. Clamping the configured 160K target directly to an 8K/24K hard
61
+ // ceiling made compaction unreachable: the request was classified as blocked
62
+ // before the compact state could ever be observed.
63
+ const softInputTokens = Math.max(1, Math.min(profile.softInputTokens, Math.floor(hardInputTokens * 0.75)));
64
+ const compactionHeadroom = Math.min(4_096, Math.max(1, Math.floor(hardInputTokens * 0.1)));
65
+ const compactionThreshold = Math.min(profile.compactionThreshold, Math.max(softInputTokens, hardInputTokens - compactionHeadroom));
66
+ const configuredCompaction = Math.max(1, profile.compactionThreshold);
67
+ const tightenThreshold = Math.max(1, Math.min(profile.tightenThreshold, Math.floor(compactionThreshold * (profile.tightenThreshold / configuredCompaction))));
68
+ const evictionThreshold = Math.max(tightenThreshold, Math.min(profile.evictionThreshold, Math.floor(compactionThreshold * (profile.evictionThreshold / configuredCompaction))));
69
+ return Object.freeze({
70
+ compactionThreshold,
71
+ contextWindow,
72
+ evictionThreshold,
73
+ fallbackContextWindow,
74
+ hardInputTokens,
75
+ outputReserveTokens,
76
+ profile,
77
+ safetyRate,
78
+ safetyReserveTokens,
79
+ softInputTokens,
80
+ tightenThreshold,
81
+ });
82
+ }
83
+ export function classifyAiCoderContextPressure(currentInputTokens, projectedInputTokens, budget) {
84
+ const effectiveInputTokens = Math.max(currentInputTokens, projectedInputTokens);
85
+ if (effectiveInputTokens >= budget.hardInputTokens)
86
+ return "blocked";
87
+ if (effectiveInputTokens >= budget.compactionThreshold)
88
+ return "compact";
89
+ if (effectiveInputTokens >= budget.evictionThreshold)
90
+ return "evict";
91
+ if (effectiveInputTokens >= budget.tightenThreshold)
92
+ return "tighten";
93
+ return "normal";
94
+ }
95
+ export function aiCoderToolOutputScale(pressure) {
96
+ if (pressure === "tighten")
97
+ return 0.75;
98
+ if (pressure === "evict" || pressure === "compact" || pressure === "blocked")
99
+ return 0.5;
100
+ return 1;
101
+ }
102
+ //# sourceMappingURL=context-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-profile.js","sourceRoot":"","sources":["../../src/context/context-profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from "./attachment-types.js";
2
+ export * from "./checkpoint.js";
3
+ export * from "./context-manager.js";
4
+ export * from "./context-profile.js";
5
+ export * from "./token-ledger.js";
6
+ export * from "./tool-output.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from "./attachment-types.js";
2
+ export * from "./checkpoint.js";
3
+ export * from "./context-manager.js";
4
+ export * from "./context-profile.js";
5
+ export * from "./token-ledger.js";
6
+ export * from "./tool-output.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/context/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @author Bùi Trọng Hiếu
3
+ * @email kevinbui210191@gmail.com
4
+ * @create date 2026-08-21
5
+ * @modify date 2026-08-21
6
+ * @desc Token estimator + vision accounting + per-run ledger. Provider usage overrides estimator when available.
7
+ */
8
+ import type { AiCoderAttachment } from "./attachment-types.js";
9
+ import type { AiCoderTokenProfile } from "../tools/settings-types.js";
10
+ export type AiCoderTokenContentKind = "code" | "english" | "json" | "vietnamese";
11
+ export type AiCoderTokenCategories = Readonly<{
12
+ checkpoint: number;
13
+ flexible: number;
14
+ history: number;
15
+ images: number;
16
+ system: number;
17
+ toolDefinitions: number;
18
+ toolResults: number;
19
+ user: number;
20
+ workspace: number;
21
+ }>;
22
+ export type AiCoderVisionAccounting = Readonly<{
23
+ actualPromptTokenDelta: number | null;
24
+ estimatedVisionTokens: number;
25
+ imageArtifactIds: readonly string[];
26
+ imageCount: number;
27
+ totalDecodedPixels: number;
28
+ totalImageBytes: number;
29
+ visionEstimatorVersion: string;
30
+ }>;
31
+ export type AiCoderVisionBucket = "large" | "medium" | "small" | "thumbnail";
32
+ export type AiCoderTokenLedgerEntry = Readonly<{
33
+ actualInput: number | null;
34
+ categories: AiCoderTokenCategories;
35
+ compactionCount: number;
36
+ contextWindow: number;
37
+ estimatedInput: number;
38
+ estimationErrorRate: number | null;
39
+ model: string;
40
+ outputTokens: number;
41
+ profile: AiCoderTokenProfile;
42
+ providerOutputTokens: number | null;
43
+ runId: string;
44
+ thinkingTokens: number;
45
+ timestamp: string;
46
+ toolDefinitionTokens: number;
47
+ toolResultTokens: number;
48
+ turn: number;
49
+ vision: AiCoderVisionAccounting;
50
+ }>;
51
+ export type AiCoderTokenLedgerSnapshot = Readonly<{
52
+ entries: readonly AiCoderTokenLedgerEntry[];
53
+ hasProviderUsage: boolean;
54
+ runId: string;
55
+ schemaVersion: 1;
56
+ }>;
57
+ export declare function classifyAiCoderTokenContent(value: string): AiCoderTokenContentKind;
58
+ export declare class AiCoderTokenEstimator {
59
+ private readonly calibration;
60
+ private readonly observedKinds;
61
+ estimateText(value: string, kind?: AiCoderTokenContentKind): number;
62
+ estimateSerializable(value: unknown, kind?: AiCoderTokenContentKind): number;
63
+ calibrate(kind: AiCoderTokenContentKind, estimated: number, actual: number): void;
64
+ calibrateObserved(estimated: number, actual: number): void;
65
+ }
66
+ export declare class AiCoderVisionTokenEstimator {
67
+ private readonly factors;
68
+ private calibrationCount;
69
+ estimate(attachments: readonly AiCoderAttachment[], actualPromptTokenDelta?: number | null): AiCoderVisionAccounting;
70
+ calibrate(attachments: readonly AiCoderAttachment[], actualPromptTokenDelta: number): Readonly<{
71
+ actualPromptTokenDelta: number | null;
72
+ estimatedVisionTokens: number;
73
+ imageArtifactIds: readonly string[];
74
+ imageCount: number;
75
+ totalDecodedPixels: number;
76
+ totalImageBytes: number;
77
+ visionEstimatorVersion: string;
78
+ }>;
79
+ }
80
+ export declare function accountAiCoderVision(attachments: readonly AiCoderAttachment[]): AiCoderVisionAccounting;
81
+ export declare class AiCoderTokenLedger {
82
+ readonly runId: string;
83
+ private readonly timestamp;
84
+ private readonly entries;
85
+ constructor(runId: string, timestamp?: () => string);
86
+ get hasProviderUsage(): boolean;
87
+ record(input: Readonly<{
88
+ categories?: Partial<AiCoderTokenCategories>;
89
+ compactionCount: number;
90
+ contextWindow: number;
91
+ estimatedInput: number;
92
+ model: string;
93
+ profile: AiCoderTokenProfile;
94
+ turn: number;
95
+ usage?: Readonly<Record<string, unknown>> | null;
96
+ visibleOutput?: string;
97
+ thinking?: string;
98
+ vision?: AiCoderVisionAccounting;
99
+ }>, estimator: AiCoderTokenEstimator): AiCoderTokenLedgerEntry;
100
+ snapshot(): AiCoderTokenLedgerSnapshot;
101
+ }
102
+ //# sourceMappingURL=token-ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-ledger.d.ts","sourceRoot":"","sources":["../../src/context/token-ledger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * @author Bùi Trọng Hiếu
3
+ * @email kevinbui210191@gmail.com
4
+ * @create date 2026-08-21
5
+ * @modify date 2026-08-21
6
+ * @desc Token estimator + vision accounting + per-run ledger. Provider usage overrides estimator when available.
7
+ */
8
+ const EMPTY_CATEGORIES = Object.freeze({
9
+ checkpoint: 0,
10
+ flexible: 0,
11
+ history: 0,
12
+ images: 0,
13
+ system: 0,
14
+ toolDefinitions: 0,
15
+ toolResults: 0,
16
+ user: 0,
17
+ workspace: 0,
18
+ });
19
+ const VIETNAMESE_MARKS = /[àáạảãâầấậẩẫăằắặẳẵèéẹẻẽêềếệểễìíịỉĩòóọỏõôồốộổỗơờớợởỡùúụủũưừứựửữỳýỵỷỹđ]/i;
20
+ const CODE_MARKERS = /(?:=>|\b(?:const|let|var|function|class|interface|return|import|export|def|fn|impl)\b|[{};])/;
21
+ function numericValue(record, keys) {
22
+ for (const key of keys) {
23
+ const value = record[key];
24
+ if (typeof value === "number" && Number.isFinite(value) && value >= 0)
25
+ return Math.floor(value);
26
+ }
27
+ return null;
28
+ }
29
+ export function classifyAiCoderTokenContent(value) {
30
+ const trimmed = value.trim();
31
+ if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
32
+ try {
33
+ JSON.parse(trimmed);
34
+ return "json";
35
+ }
36
+ catch {
37
+ // Continue with language/code heuristics for malformed or partial JSON.
38
+ }
39
+ }
40
+ if (CODE_MARKERS.test(value))
41
+ return "code";
42
+ if (VIETNAMESE_MARKS.test(value))
43
+ return "vietnamese";
44
+ return "english";
45
+ }
46
+ export class AiCoderTokenEstimator {
47
+ calibration = new Map();
48
+ observedKinds = new Set();
49
+ estimateText(value, kind = classifyAiCoderTokenContent(value)) {
50
+ if (!value)
51
+ return 0;
52
+ this.observedKinds.add(kind);
53
+ const charsPerToken = kind === "code" ? 3 : kind === "vietnamese" ? 2.5 : kind === "json" ? 2.8 : 4;
54
+ const calibration = this.calibration.get(kind) ?? 1;
55
+ return Math.ceil((value.length / charsPerToken) * 1.15 * calibration);
56
+ }
57
+ estimateSerializable(value, kind) {
58
+ return this.estimateText(typeof value === "string" ? value : JSON.stringify(value), kind);
59
+ }
60
+ calibrate(kind, estimated, actual) {
61
+ if (estimated <= 0 || actual <= 0)
62
+ return;
63
+ const observed = actual / estimated;
64
+ const previous = this.calibration.get(kind) ?? 1;
65
+ this.calibration.set(kind, Math.min(2, Math.max(0.5, previous * 0.75 + observed * 0.25)));
66
+ }
67
+ calibrateObserved(estimated, actual) {
68
+ for (const kind of this.observedKinds)
69
+ this.calibrate(kind, estimated, actual);
70
+ this.observedKinds.clear();
71
+ }
72
+ }
73
+ function decodedDataUrlBytes(dataUrl) {
74
+ if (!dataUrl)
75
+ return 0;
76
+ const separator = dataUrl.indexOf(",");
77
+ if (separator < 0)
78
+ return 0;
79
+ const metadata = dataUrl.slice(0, separator);
80
+ const payload = dataUrl.slice(separator + 1);
81
+ return metadata.includes(";base64")
82
+ ? Math.max(0, Math.floor((payload.length * 3) / 4) - (payload.endsWith("==") ? 2 : payload.endsWith("=") ? 1 : 0))
83
+ : new TextEncoder().encode(payload).byteLength;
84
+ }
85
+ function visionBucket(attachment) {
86
+ const pixels = attachment.decodedPixels ?? ((attachment.width ?? 0) * (attachment.height ?? 0));
87
+ const bytes = attachment.byteLength ?? decodedDataUrlBytes(attachment.dataUrl);
88
+ if (pixels > 0) {
89
+ if (pixels <= 256_000)
90
+ return "thumbnail";
91
+ if (pixels <= 1_000_000)
92
+ return "small";
93
+ if (pixels <= 4_000_000)
94
+ return "medium";
95
+ return "large";
96
+ }
97
+ if (bytes <= 100_000)
98
+ return "thumbnail";
99
+ if (bytes <= 500_000)
100
+ return "small";
101
+ if (bytes <= 2_000_000)
102
+ return "medium";
103
+ return "large";
104
+ }
105
+ const VISION_BUCKET_DEFAULTS = Object.freeze({
106
+ thumbnail: 800,
107
+ small: 1_800,
108
+ medium: 3_200,
109
+ large: 6_000,
110
+ });
111
+ export class AiCoderVisionTokenEstimator {
112
+ factors = new Map();
113
+ calibrationCount = 0;
114
+ estimate(attachments, actualPromptTokenDelta = null) {
115
+ const estimatedVisionTokens = attachments.reduce((sum, item) => {
116
+ const bucket = visionBucket(item);
117
+ return sum + Math.ceil(VISION_BUCKET_DEFAULTS[bucket] * (this.factors.get(bucket) ?? 1));
118
+ }, 0);
119
+ return Object.freeze({
120
+ actualPromptTokenDelta,
121
+ estimatedVisionTokens,
122
+ imageArtifactIds: Object.freeze(attachments.map((item) => item.artifactId)),
123
+ imageCount: attachments.length,
124
+ totalDecodedPixels: attachments.reduce((sum, item) => sum + (item.decodedPixels ?? ((item.width ?? 0) * (item.height ?? 0))), 0),
125
+ totalImageBytes: attachments.reduce((sum, item) => sum + (item.byteLength ?? decodedDataUrlBytes(item.dataUrl)), 0),
126
+ visionEstimatorVersion: this.calibrationCount ? `calibrated-image-buckets/1.${this.calibrationCount}` : "fallback-image-buckets/1",
127
+ });
128
+ }
129
+ calibrate(attachments, actualPromptTokenDelta) {
130
+ const baseline = this.estimate(attachments).estimatedVisionTokens;
131
+ if (!attachments.length || baseline <= 0 || actualPromptTokenDelta <= 0)
132
+ return this.estimate(attachments);
133
+ const ratio = Math.min(2, Math.max(0.5, actualPromptTokenDelta / baseline));
134
+ const buckets = new Set(attachments.map(visionBucket));
135
+ for (const bucket of buckets) {
136
+ const previous = this.factors.get(bucket) ?? 1;
137
+ this.factors.set(bucket, previous * 0.75 + ratio * 0.25);
138
+ }
139
+ this.calibrationCount += 1;
140
+ return this.estimate(attachments, actualPromptTokenDelta);
141
+ }
142
+ }
143
+ export function accountAiCoderVision(attachments) {
144
+ return new AiCoderVisionTokenEstimator().estimate(attachments);
145
+ }
146
+ export class AiCoderTokenLedger {
147
+ runId;
148
+ timestamp;
149
+ entries = [];
150
+ constructor(runId, timestamp = () => new Date().toISOString()) {
151
+ this.runId = runId;
152
+ this.timestamp = timestamp;
153
+ }
154
+ get hasProviderUsage() {
155
+ return this.entries.some((entry) => entry.actualInput !== null);
156
+ }
157
+ record(input, estimator) {
158
+ const usage = input.usage ?? {};
159
+ const actualInput = numericValue(usage, ["prompt_eval_count", "input_tokens", "prompt_tokens", "inputTokens"]);
160
+ const providerOutputTokens = numericValue(usage, ["eval_count", "output_tokens", "completion_tokens", "outputTokens"]);
161
+ const estimatedThinking = estimator.estimateText(input.thinking ?? "");
162
+ const estimatedVisible = estimator.estimateText(input.visibleOutput ?? "");
163
+ const thinkingTokens = providerOutputTokens === null
164
+ ? estimatedThinking
165
+ : Math.min(providerOutputTokens, estimatedThinking);
166
+ const outputTokens = providerOutputTokens === null
167
+ ? estimatedVisible
168
+ : Math.max(0, providerOutputTokens - thinkingTokens);
169
+ const categories = Object.freeze({ ...EMPTY_CATEGORIES, ...input.categories });
170
+ const entry = Object.freeze({
171
+ actualInput,
172
+ categories,
173
+ compactionCount: input.compactionCount,
174
+ contextWindow: input.contextWindow,
175
+ estimatedInput: input.estimatedInput,
176
+ estimationErrorRate: actualInput === null || actualInput === 0
177
+ ? null
178
+ : Math.abs(input.estimatedInput - actualInput) / actualInput,
179
+ model: input.model,
180
+ outputTokens,
181
+ profile: input.profile,
182
+ providerOutputTokens,
183
+ runId: this.runId,
184
+ thinkingTokens,
185
+ timestamp: this.timestamp(),
186
+ toolDefinitionTokens: categories.toolDefinitions,
187
+ toolResultTokens: categories.toolResults,
188
+ turn: input.turn,
189
+ vision: input.vision ?? accountAiCoderVision([]),
190
+ });
191
+ this.entries.push(entry);
192
+ if (actualInput !== null)
193
+ estimator.calibrateObserved(input.estimatedInput, actualInput);
194
+ return entry;
195
+ }
196
+ snapshot() {
197
+ return Object.freeze({
198
+ entries: Object.freeze([...this.entries]),
199
+ hasProviderUsage: this.hasProviderUsage,
200
+ runId: this.runId,
201
+ schemaVersion: 1,
202
+ });
203
+ }
204
+ }
205
+ //# sourceMappingURL=token-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-ledger.js","sourceRoot":"","sources":["../../src/context/token-ledger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { AiCoderTokenEstimator } from "./token-ledger.js";
2
+ import type { RunExecutionContext } from "../ports/execution-context.js";
3
+ export type AiCoderToolOutputLimits = Readonly<{
4
+ maxBytes: number;
5
+ maxTokens: number;
6
+ tailFraction?: number;
7
+ }>;
8
+ export type AiCoderToolOutputArtifact = Readonly<{
9
+ id: string;
10
+ mimeType: string;
11
+ }>;
12
+ export interface AiCoderToolOutputSpill {
13
+ write(input: Readonly<{
14
+ content: string;
15
+ contentType: string;
16
+ runId: string;
17
+ toolCallId: string;
18
+ toolName: string;
19
+ }>, context: RunExecutionContext): Promise<AiCoderToolOutputArtifact>;
20
+ }
21
+ export type AiCoderBoundedToolOutput = Readonly<{
22
+ artifact: AiCoderToolOutputArtifact | null;
23
+ content: string;
24
+ originalBytes: number;
25
+ originalTokens: number;
26
+ returnedBytes: number;
27
+ returnedTokens: number;
28
+ truncated: boolean;
29
+ }>;
30
+ /**
31
+ * Bounds output before it can enter model context. The complete value may be
32
+ * persisted through an injected spill adapter; the returned head/tail remains
33
+ * useful for command failures without tying core to a filesystem.
34
+ */
35
+ export declare function boundAiCoderToolOutput(input: Readonly<{
36
+ content: string;
37
+ contentType?: string;
38
+ context?: RunExecutionContext;
39
+ estimator?: AiCoderTokenEstimator;
40
+ limits: AiCoderToolOutputLimits;
41
+ runId: string;
42
+ spill?: AiCoderToolOutputSpill;
43
+ toolCallId: string;
44
+ toolName: string;
45
+ }>): Promise<AiCoderBoundedToolOutput>;
46
+ //# sourceMappingURL=tool-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-output.d.ts","sourceRoot":"","sources":["../../src/context/tool-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAAC;AAEH,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACvE;AAED,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;IAC9C,QAAQ,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC,CAAC;AA4BH;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,QAAQ,CAAC;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAgErC"}
@@ -0,0 +1,82 @@
1
+ import { AiCoderTokenEstimator } from "./token-ledger.js";
2
+ function safePositiveInteger(value, field) {
3
+ if (!Number.isFinite(value) || value < 1)
4
+ throw new RangeError(`${field} must be a positive finite number.`);
5
+ return Math.floor(value);
6
+ }
7
+ function utf8Bytes(value) {
8
+ return new TextEncoder().encode(value).byteLength;
9
+ }
10
+ function sliceToBudget(value, maxBytes, maxTokens, estimator) {
11
+ let low = 0;
12
+ let high = value.length;
13
+ while (low < high) {
14
+ const middle = Math.ceil((low + high) / 2);
15
+ const candidate = value.slice(0, middle);
16
+ if (utf8Bytes(candidate) <= maxBytes && estimator.estimateText(candidate) <= maxTokens)
17
+ low = middle;
18
+ else
19
+ high = middle - 1;
20
+ }
21
+ return value.slice(0, low);
22
+ }
23
+ /**
24
+ * Bounds output before it can enter model context. The complete value may be
25
+ * persisted through an injected spill adapter; the returned head/tail remains
26
+ * useful for command failures without tying core to a filesystem.
27
+ */
28
+ export async function boundAiCoderToolOutput(input) {
29
+ const estimator = input.estimator ?? new AiCoderTokenEstimator();
30
+ const maxBytes = safePositiveInteger(input.limits.maxBytes, "maxBytes");
31
+ const maxTokens = safePositiveInteger(input.limits.maxTokens, "maxTokens");
32
+ const originalBytes = utf8Bytes(input.content);
33
+ const originalTokens = estimator.estimateText(input.content);
34
+ if (originalBytes <= maxBytes && originalTokens <= maxTokens) {
35
+ return Object.freeze({
36
+ artifact: null,
37
+ content: input.content,
38
+ originalBytes,
39
+ originalTokens,
40
+ returnedBytes: originalBytes,
41
+ returnedTokens: originalTokens,
42
+ truncated: false,
43
+ });
44
+ }
45
+ if (input.spill && !input.context) {
46
+ throw new RangeError("A spill adapter requires the run execution context for cancellation and deadline enforcement.");
47
+ }
48
+ let artifact = null;
49
+ if (input.spill && input.context) {
50
+ artifact = await input.spill.write({
51
+ content: input.content,
52
+ contentType: input.contentType ?? "text/plain",
53
+ runId: input.runId,
54
+ toolCallId: input.toolCallId,
55
+ toolName: input.toolName,
56
+ }, input.context);
57
+ }
58
+ const tailFraction = Math.min(0.5, Math.max(0, input.limits.tailFraction ?? 0.25));
59
+ const artifactHint = artifact ? ` Complete output: artifact://${artifact.id}.` : " Use pagination for the complete result.";
60
+ const marker = `\n…[GALAXY OUTPUT TRUNCATED.${artifactHint}]…\n`;
61
+ const markerBytes = utf8Bytes(marker);
62
+ const markerTokens = estimator.estimateText(marker);
63
+ const availableBytes = Math.max(1, maxBytes - markerBytes);
64
+ const availableTokens = Math.max(1, maxTokens - markerTokens);
65
+ const head = sliceToBudget(input.content, Math.max(1, Math.floor(availableBytes * (1 - tailFraction))), Math.max(1, Math.floor(availableTokens * (1 - tailFraction))), estimator);
66
+ const reversedTail = sliceToBudget([...input.content].reverse().join(""), Math.max(1, Math.floor(availableBytes * tailFraction)), Math.max(1, Math.floor(availableTokens * tailFraction)), estimator);
67
+ const tail = [...reversedTail].reverse().join("");
68
+ let content = `${head}${marker}${tail}`;
69
+ if (utf8Bytes(content) > maxBytes || estimator.estimateText(content) > maxTokens) {
70
+ content = sliceToBudget(content, maxBytes, maxTokens, estimator);
71
+ }
72
+ return Object.freeze({
73
+ artifact,
74
+ content,
75
+ originalBytes,
76
+ originalTokens,
77
+ returnedBytes: utf8Bytes(content),
78
+ returnedTokens: estimator.estimateText(content),
79
+ truncated: true,
80
+ });
81
+ }
82
+ //# sourceMappingURL=tool-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-output.js","sourceRoot":"","sources":["../../src/context/tool-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Locale-independent UTF-16 code-unit ordering for hashes and replay ties. */
2
+ export declare function compareAiCoderText(left: string, right: string): number;
3
+ //# sourceMappingURL=deterministic-order.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deterministic-order.d.ts","sourceRoot":"","sources":["../src/deterministic-order.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtE"}
@@ -0,0 +1,5 @@
1
+ /** Locale-independent UTF-16 code-unit ordering for hashes and replay ties. */
2
+ export function compareAiCoderText(left, right) {
3
+ return left < right ? -1 : left > right ? 1 : 0;
4
+ }
5
+ //# sourceMappingURL=deterministic-order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deterministic-order.js","sourceRoot":"","sources":["../src/deterministic-order.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,KAAa;IAC5D,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @author Bùi Trọng Hiếu
3
+ * @email kevinbui210191@gmail.com
4
+ * @create date 2026-08-21
5
+ * @modify date 2026-08-28
6
+ * @desc Public barrel for the platform-neutral Galaxy AI Coder runtime.
7
+ */
8
+ export * from "./ports/index.js";
9
+ export * from "./approval/index.js";
10
+ export * from "./context/index.js";
11
+ export * from "./prompt/index.js";
12
+ export * from "./retrieval/index.js";
13
+ export * from "./runtime/index.js";
14
+ export * from "./tools/json-schema.js";
15
+ export * from "./tools/settings-types.js";
16
+ export * from "./tools/tool-effect-profile.js";
17
+ export * from "./tools/tool-registry-types.js";
18
+ export * from "./tools/tool-registry.js";
19
+ //# sourceMappingURL=index.d.ts.map