@askdkc/kiokuko 0.1.32 → 0.2.1

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 (168) hide show
  1. package/README.ja.md +59 -4
  2. package/README.ko.md +54 -4
  3. package/README.md +66 -4
  4. package/README.zh-CN.md +54 -4
  5. package/dist/agent-file/render.d.ts +1 -1
  6. package/dist/agent-file/render.d.ts.map +1 -1
  7. package/dist/agent-file/render.js +13 -6
  8. package/dist/agent-file/render.js.map +1 -1
  9. package/dist/akinator/agent-task.d.ts +2 -0
  10. package/dist/akinator/agent-task.d.ts.map +1 -1
  11. package/dist/akinator/agent-task.js +49 -13
  12. package/dist/akinator/agent-task.js.map +1 -1
  13. package/dist/akinator/capabilities.d.ts.map +1 -1
  14. package/dist/akinator/capabilities.js +21 -14
  15. package/dist/akinator/capabilities.js.map +1 -1
  16. package/dist/akinator/skill-discovery-attempt.d.ts +7 -1
  17. package/dist/akinator/skill-discovery-attempt.d.ts.map +1 -1
  18. package/dist/akinator/skill-discovery-attempt.js +104 -25
  19. package/dist/akinator/skill-discovery-attempt.js.map +1 -1
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +5 -1
  22. package/dist/cli.js.map +1 -1
  23. package/dist/commands/agent.d.ts.map +1 -1
  24. package/dist/commands/agent.js +18 -9
  25. package/dist/commands/agent.js.map +1 -1
  26. package/dist/commands/enno.d.ts +7 -0
  27. package/dist/commands/enno.d.ts.map +1 -0
  28. package/dist/commands/enno.js +76 -0
  29. package/dist/commands/enno.js.map +1 -0
  30. package/dist/commands/setup.d.ts +5 -1
  31. package/dist/commands/setup.d.ts.map +1 -1
  32. package/dist/commands/setup.js +83 -18
  33. package/dist/commands/setup.js.map +1 -1
  34. package/dist/config/paths.d.ts +6 -0
  35. package/dist/config/paths.d.ts.map +1 -1
  36. package/dist/config/paths.js +40 -0
  37. package/dist/config/paths.js.map +1 -1
  38. package/dist/enno-oduno/adapters.d.ts +18 -0
  39. package/dist/enno-oduno/adapters.d.ts.map +1 -0
  40. package/dist/enno-oduno/adapters.js +216 -0
  41. package/dist/enno-oduno/adapters.js.map +1 -0
  42. package/dist/enno-oduno/advisory-store.d.ts +25 -0
  43. package/dist/enno-oduno/advisory-store.d.ts.map +1 -0
  44. package/dist/enno-oduno/advisory-store.js +93 -0
  45. package/dist/enno-oduno/advisory-store.js.map +1 -0
  46. package/dist/enno-oduno/advisory.d.ts +16 -0
  47. package/dist/enno-oduno/advisory.d.ts.map +1 -0
  48. package/dist/enno-oduno/advisory.js +128 -0
  49. package/dist/enno-oduno/advisory.js.map +1 -0
  50. package/dist/enno-oduno/confirmation.d.ts +4 -0
  51. package/dist/enno-oduno/confirmation.d.ts.map +1 -0
  52. package/dist/enno-oduno/confirmation.js +124 -0
  53. package/dist/enno-oduno/confirmation.js.map +1 -0
  54. package/dist/enno-oduno/directives.d.ts +12 -0
  55. package/dist/enno-oduno/directives.d.ts.map +1 -0
  56. package/dist/enno-oduno/directives.js +241 -0
  57. package/dist/enno-oduno/directives.js.map +1 -0
  58. package/dist/enno-oduno/enno-oduno.d.mts +2 -0
  59. package/dist/enno-oduno/enno-oduno.d.mts.map +1 -0
  60. package/dist/enno-oduno/enno-oduno.mjs +3 -0
  61. package/dist/enno-oduno/enno-oduno.mjs.map +1 -0
  62. package/dist/enno-oduno/experts.d.ts +6 -0
  63. package/dist/enno-oduno/experts.d.ts.map +1 -0
  64. package/dist/enno-oduno/experts.js +18 -0
  65. package/dist/enno-oduno/experts.js.map +1 -0
  66. package/dist/enno-oduno/goki.d.mts +2 -0
  67. package/dist/enno-oduno/goki.d.mts.map +1 -0
  68. package/dist/enno-oduno/goki.mjs +3 -0
  69. package/dist/enno-oduno/goki.mjs.map +1 -0
  70. package/dist/enno-oduno/handoff.d.ts +4 -0
  71. package/dist/enno-oduno/handoff.d.ts.map +1 -0
  72. package/dist/enno-oduno/handoff.js +18 -0
  73. package/dist/enno-oduno/handoff.js.map +1 -0
  74. package/dist/enno-oduno/harness.d.ts +20 -0
  75. package/dist/enno-oduno/harness.d.ts.map +1 -0
  76. package/dist/enno-oduno/harness.js +65 -0
  77. package/dist/enno-oduno/harness.js.map +1 -0
  78. package/dist/enno-oduno/instructions.d.ts +5 -0
  79. package/dist/enno-oduno/instructions.d.ts.map +1 -0
  80. package/dist/enno-oduno/instructions.js +10 -0
  81. package/dist/enno-oduno/instructions.js.map +1 -0
  82. package/dist/enno-oduno/role-runner.d.ts +9 -0
  83. package/dist/enno-oduno/role-runner.d.ts.map +1 -0
  84. package/dist/enno-oduno/role-runner.js +171 -0
  85. package/dist/enno-oduno/role-runner.js.map +1 -0
  86. package/dist/enno-oduno/schemas.d.ts +668 -0
  87. package/dist/enno-oduno/schemas.d.ts.map +1 -0
  88. package/dist/enno-oduno/schemas.js +381 -0
  89. package/dist/enno-oduno/schemas.js.map +1 -0
  90. package/dist/enno-oduno/service.d.ts +49 -0
  91. package/dist/enno-oduno/service.d.ts.map +1 -0
  92. package/dist/enno-oduno/service.js +1005 -0
  93. package/dist/enno-oduno/service.js.map +1 -0
  94. package/dist/enno-oduno/skills.d.ts +22 -0
  95. package/dist/enno-oduno/skills.d.ts.map +1 -0
  96. package/dist/enno-oduno/skills.js +127 -0
  97. package/dist/enno-oduno/skills.js.map +1 -0
  98. package/dist/enno-oduno/store.d.ts +67 -0
  99. package/dist/enno-oduno/store.d.ts.map +1 -0
  100. package/dist/enno-oduno/store.js +380 -0
  101. package/dist/enno-oduno/store.js.map +1 -0
  102. package/dist/enno-oduno/types.d.ts +357 -0
  103. package/dist/enno-oduno/types.d.ts.map +1 -0
  104. package/dist/enno-oduno/types.js +64 -0
  105. package/dist/enno-oduno/types.js.map +1 -0
  106. package/dist/enno-oduno/verifier.d.ts +9 -0
  107. package/dist/enno-oduno/verifier.d.ts.map +1 -0
  108. package/dist/enno-oduno/verifier.js +101 -0
  109. package/dist/enno-oduno/verifier.js.map +1 -0
  110. package/dist/enno-oduno/zenki.d.mts +2 -0
  111. package/dist/enno-oduno/zenki.d.mts.map +1 -0
  112. package/dist/enno-oduno/zenki.mjs +3 -0
  113. package/dist/enno-oduno/zenki.mjs.map +1 -0
  114. package/dist/ledger/types.d.ts +1 -1
  115. package/dist/ledger/types.d.ts.map +1 -1
  116. package/dist/ledger/types.js +5 -0
  117. package/dist/ledger/types.js.map +1 -1
  118. package/dist/mcp/server.d.ts +1 -0
  119. package/dist/mcp/server.d.ts.map +1 -1
  120. package/dist/mcp/server.js +76 -26
  121. package/dist/mcp/server.js.map +1 -1
  122. package/dist/setup/claude-config.d.ts +2 -0
  123. package/dist/setup/claude-config.d.ts.map +1 -1
  124. package/dist/setup/claude-config.js +12 -0
  125. package/dist/setup/claude-config.js.map +1 -1
  126. package/dist/setup/enno-client-config.d.ts +9 -0
  127. package/dist/setup/enno-client-config.d.ts.map +1 -0
  128. package/dist/setup/enno-client-config.js +172 -0
  129. package/dist/setup/enno-client-config.js.map +1 -0
  130. package/dist/setup/opencode-config.d.ts +2 -0
  131. package/dist/setup/opencode-config.d.ts.map +1 -1
  132. package/dist/setup/opencode-config.js +12 -0
  133. package/dist/setup/opencode-config.js.map +1 -1
  134. package/dist/setup/render.d.ts +2 -0
  135. package/dist/setup/render.d.ts.map +1 -1
  136. package/dist/setup/render.js +23 -12
  137. package/dist/setup/render.js.map +1 -1
  138. package/dist/setup/standard-skills.d.ts +23 -4
  139. package/dist/setup/standard-skills.d.ts.map +1 -1
  140. package/dist/setup/standard-skills.js +51 -1
  141. package/dist/setup/standard-skills.js.map +1 -1
  142. package/dist/skills/discovery-service.d.ts.map +1 -1
  143. package/dist/skills/discovery-service.js +7 -3
  144. package/dist/skills/discovery-service.js.map +1 -1
  145. package/dist/skills/types.d.ts +1 -0
  146. package/dist/skills/types.d.ts.map +1 -1
  147. package/migrations/013_enno_oduno.sql +176 -0
  148. package/migrations/014_oduno_reflection_phases.sql +40 -0
  149. package/migrations/015_skill_discovery_attempt_digests.sql +90 -0
  150. package/migrations/016_enno_advisory_rounds.sql +67 -0
  151. package/package.json +7 -1
  152. package/skills/kiokuko-enno-oduno/SKILL.md +143 -0
  153. package/skills/kiokuko-enno-oduno/enno-oduno.png +0 -0
  154. package/skills/kiokuko-single-purpose-functions/SKILL.md +44 -258
  155. package/skills/kiokuko-single-purpose-functions/references/boundaries-and-ownership.md +50 -0
  156. package/skills/kiokuko-single-purpose-functions/references/domain-and-types.md +48 -0
  157. package/skills/kiokuko-single-purpose-functions/references/effects-and-data.md +43 -0
  158. package/skills/kiokuko-single-purpose-functions/references/protocols-and-idempotency.md +42 -0
  159. package/skills/kiokuko-single-purpose-functions/references/verification.md +41 -0
  160. package/skills/kiokuko-soul/SKILL.md +72 -0
  161. package/skills/kiokuko-ui-design-soul/SKILL.md +39 -1178
  162. package/skills/kiokuko-ui-design-soul/references/accessibility-and-navigation.md +31 -0
  163. package/skills/kiokuko-ui-design-soul/references/async-recovery.md +49 -0
  164. package/skills/kiokuko-ui-design-soul/references/forms-and-controls.md +35 -0
  165. package/skills/kiokuko-ui-design-soul/references/interaction-feedback.md +34 -0
  166. package/skills/kiokuko-ui-design-soul/references/responsive-and-platform.md +38 -0
  167. package/skills/kiokuko-ui-design-soul/references/safety-and-review.md +39 -0
  168. package/templates/AGENTS.md +11 -6
@@ -0,0 +1,124 @@
1
+ import path from 'node:path';
2
+ import { KiokukoError } from '../errors.js';
3
+ import { findSecretInValue } from '../memory/secrets.js';
4
+ import { canonicalJson } from '../serialization/validate.js';
5
+ export const MAX_CONFIRMATION_JSON_BYTES = 64 * 1024;
6
+ const BASIS_BY_PROVENANCE = {
7
+ explicit_user: 'user',
8
+ repository_evidence: 'repository',
9
+ inferred: 'proposal',
10
+ };
11
+ const EXPERT_AREAS = {
12
+ 'code.boundary.v1': 'Input and data boundaries',
13
+ 'code.domain.v1': 'Business rules and state transitions',
14
+ 'code.effects.v1': 'Database, filesystem, network, and process effects',
15
+ 'code.protocol.v1': 'Retries, conflicts, revisions, and compatibility',
16
+ 'code.verification.v1': 'Regression prevention and verification design',
17
+ 'ui.interaction.v1': 'Interaction states and feedback',
18
+ 'ui.async.v1': 'Asynchronous work and recovery',
19
+ 'ui.forms.v1': 'Forms and input validation',
20
+ 'ui.accessibility.v1': 'Accessibility and navigation',
21
+ 'ui.layout.v1': 'Responsive layout',
22
+ 'ui.safety.v1': 'UI safety and review',
23
+ };
24
+ function basisFor(provenance, key) {
25
+ return BASIS_BY_PROVENANCE[provenance[key]];
26
+ }
27
+ function displayDirectory(cwd, repositoryRoot) {
28
+ const relative = path.relative(repositoryRoot, cwd);
29
+ if (relative === '')
30
+ return '.';
31
+ if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
32
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored Enno verifier cwd escapes the repository root');
33
+ }
34
+ return relative;
35
+ }
36
+ function toUserFacingVerifier(verifier, repositoryRoot) {
37
+ return {
38
+ category: verifier.kind,
39
+ executable: verifier.executable,
40
+ arguments: [...verifier.args],
41
+ directory: displayDirectory(verifier.cwd, repositoryRoot),
42
+ timeoutMs: verifier.timeoutMs,
43
+ };
44
+ }
45
+ function toUserFacingSkill(entry, basis) {
46
+ return {
47
+ label: entry.name,
48
+ basis,
49
+ required: entry.required,
50
+ purposes: [...entry.purposes],
51
+ referenceOnly: entry.availability === 'external_reference',
52
+ };
53
+ }
54
+ function toUserFacingExpertise(reference, basis) {
55
+ const area = EXPERT_AREAS[reference.id];
56
+ if (area === undefined) {
57
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored Enno expert selection is outside the registered expert set');
58
+ }
59
+ return { area, basis, reason: reference.reason };
60
+ }
61
+ function workItemNumbers(units) {
62
+ const numbers = new Map();
63
+ units.forEach((unit, index) => {
64
+ numbers.set(unit.id, index + 1);
65
+ });
66
+ return numbers;
67
+ }
68
+ function toUserFacingWorkItem(unit, number, numbers, basis, repositoryRoot) {
69
+ return {
70
+ number,
71
+ summary: unit.objective,
72
+ paths: [...unit.scope],
73
+ dependsOn: unit.dependencies.map((dependency) => {
74
+ const resolved = numbers.get(dependency);
75
+ if (resolved === undefined) {
76
+ throw new KiokukoError('INTEGRITY_ERROR', 'Stored Enno WorkPlan dependency does not resolve to a displayed work item');
77
+ }
78
+ return resolved;
79
+ }),
80
+ doneWhen: [...unit.acceptanceCriteria],
81
+ checks: unit.focusedVerifiers.map((verifier) => toUserFacingVerifier(verifier, repositoryRoot)),
82
+ expertise: unit.expertRefs.map((reference) => toUserFacingExpertise(reference, basis)),
83
+ };
84
+ }
85
+ function assertDisplaySafety(confirmation) {
86
+ const secret = findSecretInValue(confirmation);
87
+ if (secret !== undefined) {
88
+ throw new KiokukoError('SECURITY_REJECTION', 'Plan confirmation resembles a secret and was not displayed', { kind: secret.kind });
89
+ }
90
+ if (Buffer.byteLength(canonicalJson(confirmation), 'utf8') > MAX_CONFIRMATION_JSON_BYTES) {
91
+ throw new KiokukoError('VALIDATION_ERROR', 'Plan confirmation exceeds the 64 KiB display limit and must be replanned');
92
+ }
93
+ }
94
+ export function buildUserFacingConfirmation(snapshot) {
95
+ if (snapshot.status !== 'needs_confirmation')
96
+ return undefined;
97
+ const contract = snapshot.contract;
98
+ const provenance = contract.provenance;
99
+ const workPlanBasis = basisFor(provenance, 'workPlan');
100
+ const skillBasis = basisFor(provenance, 'skillSet');
101
+ const numbers = workItemNumbers(contract.workPlan.units);
102
+ const confirmation = {
103
+ presentationVersion: 1,
104
+ title: 'Plan approval',
105
+ summary: { basis: workPlanBasis, text: contract.workPlan.objective },
106
+ scope: { basis: basisFor(provenance, 'scope'), paths: [...contract.scope] },
107
+ exclusions: { basis: basisFor(provenance, 'exclusions'), paths: [...contract.exclusions] },
108
+ completion: {
109
+ basis: basisFor(provenance, 'acceptanceCriteria'),
110
+ items: contract.acceptanceCriteria.map((criterion) => criterion.description),
111
+ },
112
+ skills: contract.skillSet.entries.map((entry) => toUserFacingSkill(entry, skillBasis)),
113
+ workItems: contract.workPlan.units.map((unit, index) => toUserFacingWorkItem(unit, index + 1, numbers, workPlanBasis, snapshot.repositoryRoot)),
114
+ finalChecks: {
115
+ basis: basisFor(provenance, 'finalVerifiers'),
116
+ checks: contract.finalVerifiers.map((verifier) => toUserFacingVerifier(verifier, snapshot.repositoryRoot)),
117
+ },
118
+ attemptLimit: { basis: basisFor(provenance, 'maxAttempts'), maxAttempts: contract.maxAttempts },
119
+ actions: ['approve', 'revise', 'cancel'],
120
+ };
121
+ assertDisplaySafety(confirmation);
122
+ return confirmation;
123
+ }
124
+ //# sourceMappingURL=confirmation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirmation.js","sourceRoot":"","sources":["../../src/enno-oduno/confirmation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { AkinatorQuestion } from '../akinator/types.js';
2
+ import type { EnnoClientKind, EnnoRunSnapshot, RoleDirective } from './types.js';
3
+ export declare function directiveForRun(snapshot: EnnoRunSnapshot): RoleDirective | null;
4
+ export declare function directiveForIntake(input: {
5
+ runId: string;
6
+ orchestrationId: string;
7
+ clientKind: EnnoClientKind | null;
8
+ clientVersion: string | null;
9
+ question: AkinatorQuestion | null;
10
+ }): RoleDirective;
11
+ export declare function assertDirectiveRevision(snapshot: EnnoRunSnapshot, revision: number): void;
12
+ //# sourceMappingURL=directives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directives.d.ts","sourceRoot":"","sources":["../../src/enno-oduno/directives.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAQ7D,OAAO,KAAK,EACV,cAAc,EAEd,eAAe,EAEf,aAAa,EAKd,MAAM,YAAY,CAAC;AAgIpB,wBAAgB,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,aAAa,GAAG,IAAI,CAqG/E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACnC,GAAG,aAAa,CAqBhB;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAIzF"}
@@ -0,0 +1,241 @@
1
+ import { KiokukoError } from '../errors.js';
2
+ import { buildUserFacingConfirmation } from './confirmation.js';
3
+ import { STANDARD_ENNO_SKILL_NAME, STANDARD_FUNCTION_SKILL_NAME, STANDARD_SOUL_SKILL_NAME, } from '../setup/standard-skills.js';
4
+ import { orderedUniqueSkillNames } from './skills.js';
5
+ import { advisoryDirectiveForSnapshot } from './advisory.js';
6
+ const REPORT_SCHEMAS = {
7
+ intake: {
8
+ type: 'object',
9
+ required: ['runId', 'sessionId', 'questionId', 'value'],
10
+ },
11
+ plan: {
12
+ type: 'object',
13
+ required: ['scope', 'acceptanceCriteria', 'workPlan', 'skillRequirements', 'finalVerifiers', 'provenance'],
14
+ },
15
+ ideal: {
16
+ type: 'object',
17
+ required: ['runId', 'expectedRevision', 'ideal'],
18
+ },
19
+ work: {
20
+ type: 'object',
21
+ required: ['workUnitId', 'result'],
22
+ },
23
+ verification: {
24
+ type: 'object',
25
+ required: ['runId', 'expectedRevision', 'review'],
26
+ properties: {
27
+ review: {
28
+ type: 'object',
29
+ required: ['decision', 'summary'],
30
+ properties: {
31
+ decision: { enum: ['accept', 'replan'] },
32
+ summary: { type: 'string' },
33
+ },
34
+ },
35
+ },
36
+ },
37
+ confirmation: {
38
+ type: 'object',
39
+ required: ['runId', 'expectedRevision', 'idempotencyKey', 'action'],
40
+ properties: {
41
+ action: { enum: ['approve', 'revise', 'cancel'] },
42
+ requestedChanges: { type: 'string' },
43
+ },
44
+ },
45
+ meditation: {
46
+ type: 'object',
47
+ required: ['runId', 'expectedRevision', 'meditation'],
48
+ },
49
+ };
50
+ const CONFIRMATION_OBJECTIVE = `Return every item in userFacingConfirmation to the user in the user's language. Translate headings only; preserve paths, executable names, arguments, limits, and every listed item. Do not expose raw directive JSON, internal field names, WorkUnit IDs, expert IDs, or verifier IDs. Wait for explicit approve, revise, or cancel before calling enno_answer.`;
51
+ const ZENKI_SINGLE_PURPOSE_PLANNING_CONTRACT = `After ${STANDARD_SOUL_SKILL_NAME} routes the work, read the compact ${STANDARD_FUNCTION_SKILL_NAME} index before decomposing the WorkPlan. Shape every code-changing WorkUnit around one cohesive externally observable function or use-case contract with one responsibility and one reason to change. State its success, expected failures, effect profile, and focused runnable test target. Select one to three versioned expertRefs for its actual risks; a UI unit needs at least one code expert and one UI expert. Compose those units without meaningless micro-functions, unrelated responsibilities, or loading every expert fragment by default.`;
52
+ function boundedObjective(value) {
53
+ return value.slice(0, 16_384);
54
+ }
55
+ function harnessContinuation(kind) {
56
+ if (kind === 'codex' || kind === 'claude')
57
+ return 'stop_hook';
58
+ if (kind === 'opencode')
59
+ return 'session_idle_plugin';
60
+ return 'unidentified';
61
+ }
62
+ function harnessInstructions(kind, role) {
63
+ const continuation = kind === 'opencode'
64
+ ? 'OpenCode continuation is delivered by the bounded session.idle plugin.'
65
+ : kind === 'codex' || kind === 'claude'
66
+ ? `${kind === 'codex' ? 'Codex' : 'Claude Code'} continuation is delivered by the bounded Stop hook.`
67
+ : 'The AI harness is not identified; use only capabilities explicitly present in the task response.';
68
+ const roleInstruction = role === 'zenki'
69
+ ? `Read and apply ${STANDARD_SOUL_SKILL_NAME} first, then every remaining required Skill index before planning. ${ZENKI_SINGLE_PURPOSE_PLANNING_CONTRACT} Create WorkUnits that this harness can execute with its currently available Skills and MCP tools; do not implement them.`
70
+ : role === 'goki'
71
+ ? `Read and apply ${STANDARD_SOUL_SKILL_NAME} first, then every remaining required Skill index and exactly the expert fragments named by the approved WorkUnit expertRefs. Orchestrate exactly one approved WorkUnit with this harness; delegation is optional and must use only available capabilities.`
72
+ : `Read and apply ${STANDARD_SOUL_SKILL_NAME} first, then ${STANDARD_ENNO_SKILL_NAME}. Own intake, user confirmation, state transitions, final review, and verification; do not perform Zenki or Goki work.`;
73
+ return [continuation, roleInstruction];
74
+ }
75
+ function harnessDirective(kind, version, role) {
76
+ return {
77
+ kind,
78
+ version,
79
+ continuation: harnessContinuation(kind),
80
+ instructions: harnessInstructions(kind, role),
81
+ };
82
+ }
83
+ function requiredSkillNames(entries) {
84
+ return entries.filter((entry) => entry.required).map((entry) => entry.name);
85
+ }
86
+ function nextReadyWorkUnit(units) {
87
+ const completed = new Set(units.filter((unit) => unit.status === 'completed').map((unit) => unit.workUnit.id));
88
+ const active = units.find((unit) => unit.status === 'in_progress');
89
+ if (active !== undefined)
90
+ return active.workUnit;
91
+ return units.find((unit) => unit.status === 'pending'
92
+ && unit.workUnit.dependencies.every((dependency) => completed.has(dependency)))?.workUnit ?? null;
93
+ }
94
+ function roleForStatus(status) {
95
+ if (status === 'zenki_planning')
96
+ return 'zenki';
97
+ if (status === 'goki_executing')
98
+ return 'goki';
99
+ if (status === 'oduno_ideal'
100
+ || status === 'enno_verifying'
101
+ || status === 'oduno_meditation'
102
+ || status === 'intake'
103
+ || status === 'needs_confirmation')
104
+ return 'enno-oduno';
105
+ return null;
106
+ }
107
+ function discoveredSkillNames(snapshot) {
108
+ return snapshot.contract.skillSet.intakeDiscovery.selected.map((skill) => skill.name);
109
+ }
110
+ function changedPaths(snapshot) {
111
+ return [...new Set(snapshot.workUnits.flatMap((unit) => unit.result?.changedPaths ?? []))];
112
+ }
113
+ function confirmationFor(snapshot) {
114
+ const projection = buildUserFacingConfirmation(snapshot);
115
+ if (projection === undefined) {
116
+ throw new KiokukoError('INTEGRITY_ERROR', 'Needs-confirmation state requires a user-facing confirmation');
117
+ }
118
+ return projection;
119
+ }
120
+ export function directiveForRun(snapshot) {
121
+ const role = roleForStatus(snapshot.status);
122
+ if (role === null)
123
+ return null;
124
+ const requiredSkills = requiredSkillNames(snapshot.contract.skillSet.entries);
125
+ const advisoryRound = advisoryDirectiveForSnapshot(snapshot);
126
+ if (role === 'zenki') {
127
+ return {
128
+ protocolVersion: 1,
129
+ runId: snapshot.runId,
130
+ contractRevision: snapshot.revision,
131
+ role,
132
+ harness: harnessDirective(snapshot.clientKind, snapshot.clientVersion, role),
133
+ handoff: snapshot.handoff,
134
+ objective: boundedObjective(snapshot.blocker === null
135
+ ? `Create a bounded WorkPlan that realizes this Oduno ideal: ${snapshot.ideal?.objective ?? snapshot.handoff.objective}. ${ZENKI_SINGLE_PURPOSE_PLANNING_CONTRACT} Select only available Skills and define focused plus final verifiers. Do not implement changes.`
136
+ : `Revise the WorkPlan in response to Enno-Oduno review or user feedback: ${snapshot.blocker} ${ZENKI_SINGLE_PURPOSE_PLANNING_CONTRACT}`),
137
+ requiredSkills: orderedUniqueSkillNames([STANDARD_SOUL_SKILL_NAME, STANDARD_FUNCTION_SKILL_NAME], requiredSkills),
138
+ workUnit: null,
139
+ stopConditions: [
140
+ 'Read every required Skill index before decomposing the WorkPlan',
141
+ 'Give each code-changing WorkUnit one cohesive function or use-case contract and a focused runnable test target',
142
+ 'Select one to three versioned expertRefs per WorkUnit and do not load unselected fragments by default',
143
+ 'Do not create meaningless micro-functions or bundle unrelated responsibilities',
144
+ 'Submit one complete plan',
145
+ 'Stop if a required capability is unavailable',
146
+ 'Do not mutate the repository',
147
+ ],
148
+ reportSchema: REPORT_SCHEMAS.plan,
149
+ ...(advisoryRound === undefined ? {} : { advisoryRound }),
150
+ };
151
+ }
152
+ if (role === 'goki') {
153
+ const workUnit = nextReadyWorkUnit(snapshot.workUnits);
154
+ return {
155
+ protocolVersion: 1,
156
+ runId: snapshot.runId,
157
+ contractRevision: snapshot.revision,
158
+ role,
159
+ harness: harnessDirective(snapshot.clientKind, snapshot.clientVersion, role),
160
+ handoff: snapshot.handoff,
161
+ objective: boundedObjective(workUnit === null
162
+ ? 'No approved WorkUnit is ready. Stop and return control to Enno-Oduno without changing the contract.'
163
+ : `Orchestrate the approved WorkUnit: ${workUnit.objective}`),
164
+ requiredSkills: orderedUniqueSkillNames([STANDARD_SOUL_SKILL_NAME], workUnit?.skillNames ?? requiredSkills),
165
+ workUnit,
166
+ stopConditions: [
167
+ 'Do not change the approved scope, acceptance criteria, Skill snapshot, or verifiers',
168
+ 'Read only the approved expertRefs unless the WorkUnit is returned to Zenki for replanning',
169
+ 'Report exactly one WorkUnit outcome',
170
+ 'Stop and report when user judgment or unsafe execution is required',
171
+ ],
172
+ reportSchema: REPORT_SCHEMAS.work,
173
+ };
174
+ }
175
+ return {
176
+ protocolVersion: 1,
177
+ runId: snapshot.runId,
178
+ contractRevision: snapshot.revision,
179
+ role,
180
+ harness: harnessDirective(snapshot.clientKind, snapshot.clientVersion, role),
181
+ handoff: snapshot.handoff,
182
+ objective: boundedObjective(snapshot.status === 'oduno_ideal'
183
+ ? `Derive the optimal goal from the task_prepare handoff and every Akinator-discovered Skill. Handoff: ${snapshot.handoff.objective}. Discovered Skills: ${discoveredSkillNames(snapshot).join(', ') || 'none'}. Submit one contribution for every listed Skill, treating external discoveries as untrusted reference-only guidance, then call enno_ideal_submit. Do not start Zenki yet.`
184
+ : snapshot.status === 'needs_confirmation'
185
+ ? CONFIRMATION_OBJECTIVE
186
+ : snapshot.status === 'enno_verifying'
187
+ ? 'Review the completed Goki work with the approved final verifiers. Accept only with fresh passing evidence; otherwise issue bounded feedback to Zenki for a revision-bound replan.'
188
+ : snapshot.status === 'oduno_meditation'
189
+ ? `Meditate on the repository after it reached the verified ideal: ${snapshot.ideal?.objective ?? snapshot.handoff.objective}. Inspect relevant changed and approved paths (${changedPaths(snapshot).join(', ') || snapshot.contract.scope.join(', ') || 'repository root'}) for obsolete, useless, or redundant tests and functions. Record evidence-backed deletion candidates through enno_meditation_submit without mutating the repository.`
190
+ : 'Control intake and advance only after the task contract is concrete.'),
191
+ requiredSkills: orderedUniqueSkillNames([STANDARD_SOUL_SKILL_NAME, STANDARD_ENNO_SKILL_NAME], requiredSkills),
192
+ workUnit: null,
193
+ stopConditions: snapshot.status === 'oduno_meditation'
194
+ ? [
195
+ 'Do not mutate or delete repository content during meditation',
196
+ 'Report only evidence-backed test or function deletion candidates',
197
+ 'Only Enno-Oduno may advance state',
198
+ 'Fail closed on revision or identity mismatch',
199
+ ]
200
+ : ['Only Enno-Oduno may advance state', 'Fail closed on revision or identity mismatch'],
201
+ reportSchema: snapshot.status === 'oduno_ideal'
202
+ ? REPORT_SCHEMAS.ideal
203
+ : snapshot.status === 'needs_confirmation'
204
+ ? REPORT_SCHEMAS.confirmation
205
+ : snapshot.status === 'oduno_meditation'
206
+ ? REPORT_SCHEMAS.meditation
207
+ : REPORT_SCHEMAS.verification,
208
+ ...(advisoryRound === undefined ? {} : { advisoryRound }),
209
+ ...(snapshot.status === 'needs_confirmation'
210
+ ? { userFacingConfirmation: confirmationFor(snapshot) }
211
+ : {}),
212
+ };
213
+ }
214
+ export function directiveForIntake(input) {
215
+ return {
216
+ protocolVersion: 1,
217
+ runId: input.runId,
218
+ contractRevision: null,
219
+ role: 'enno-oduno',
220
+ harness: harnessDirective(input.clientKind, input.clientVersion, 'enno-oduno'),
221
+ handoff: null,
222
+ objective: boundedObjective(input.question === null
223
+ ? 'Keep the request in Enno-Oduno intake until Akinator produces an actionable task profile.'
224
+ : `Return Akinator's exact question to the user and wait for the answer: ${input.question.prompt}`),
225
+ requiredSkills: [STANDARD_SOUL_SKILL_NAME, STANDARD_ENNO_SKILL_NAME],
226
+ workUnit: null,
227
+ stopConditions: [
228
+ 'Do not generate a WorkPlan during intake',
229
+ 'Do not start Goki before Zenki submits a plan and required confirmation succeeds',
230
+ 'Return control to the user for every unresolved Akinator question',
231
+ 'Stop if a required capability is unavailable',
232
+ ],
233
+ reportSchema: REPORT_SCHEMAS.intake,
234
+ };
235
+ }
236
+ export function assertDirectiveRevision(snapshot, revision) {
237
+ if (snapshot.revision !== revision) {
238
+ throw new KiokukoError('CONFLICT', 'Enno contract revision changed');
239
+ }
240
+ }
241
+ //# sourceMappingURL=directives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directives.js","sourceRoot":"","sources":["../../src/enno-oduno/directives.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=enno-oduno.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enno-oduno.d.mts","sourceRoot":"","sources":["../../src/enno-oduno/enno-oduno.mts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { runRoleScript } from './role-runner.js';
2
+ await runRoleScript('enno-oduno');
3
+ //# sourceMappingURL=enno-oduno.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enno-oduno.mjs","sourceRoot":"","sources":["../../src/enno-oduno/enno-oduno.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { WorkPlan } from './types.js';
2
+ export declare function assertWorkPlanExpertCoverage(workPlan: WorkPlan, requirements: {
3
+ includesCodeChanges: boolean;
4
+ includesUiWork: boolean;
5
+ }): void;
6
+ //# sourceMappingURL=experts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experts.d.ts","sourceRoot":"","sources":["../../src/enno-oduno/experts.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAS3C,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE;IAAE,mBAAmB,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,GACtE,IAAI,CAeN"}
@@ -0,0 +1,18 @@
1
+ import { KiokukoError } from '../errors.js';
2
+ import { STANDARD_FUNCTION_EXPERT_IDS, STANDARD_UI_EXPERT_IDS, } from '../setup/standard-skills.js';
3
+ const functionExpertIds = new Set(STANDARD_FUNCTION_EXPERT_IDS);
4
+ const uiExpertIds = new Set(STANDARD_UI_EXPERT_IDS);
5
+ function hasExpert(unit, expertIds) {
6
+ return unit.expertRefs.some((reference) => expertIds.has(reference.id));
7
+ }
8
+ export function assertWorkPlanExpertCoverage(workPlan, requirements) {
9
+ for (const unit of workPlan.units) {
10
+ if (requirements.includesCodeChanges && !hasExpert(unit, functionExpertIds)) {
11
+ throw new KiokukoError('VALIDATION_ERROR', `WorkUnit ${unit.id} must select a code expert fragment`);
12
+ }
13
+ if (requirements.includesUiWork && !hasExpert(unit, uiExpertIds)) {
14
+ throw new KiokukoError('VALIDATION_ERROR', `WorkUnit ${unit.id} must select a UI expert fragment`);
15
+ }
16
+ }
17
+ }
18
+ //# sourceMappingURL=experts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experts.js","sourceRoot":"","sources":["../../src/enno-oduno/experts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AAGrC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAS,4BAA4B,CAAC,CAAC;AACxE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,sBAAsB,CAAC,CAAC;AAE5D,SAAS,SAAS,CAAC,IAA+B,EAAE,SAA8B;IAChF,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,QAAkB,EAClB,YAAuE;IAEvE,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,YAAY,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,YAAY,IAAI,CAAC,EAAE,qCAAqC,CACzD,CAAC;QACJ,CAAC;QACD,IAAI,YAAY,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,YAAY,CACpB,kBAAkB,EAClB,YAAY,IAAI,CAAC,EAAE,mCAAmC,CACvD,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=goki.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goki.d.mts","sourceRoot":"","sources":["../../src/enno-oduno/goki.mts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { runRoleScript } from './role-runner.js';
2
+ await runRoleScript('goki');
3
+ //# sourceMappingURL=goki.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goki.mjs","sourceRoot":"","sources":["../../src/enno-oduno/goki.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { AkinatorReasoning, TaskProfile } from '../akinator/types.js';
2
+ import { type EnnoRequestHandoff } from './types.js';
3
+ export declare function buildEnnoRequestHandoff(profile: TaskProfile, reasoning: AkinatorReasoning): EnnoRequestHandoff;
4
+ //# sourceMappingURL=handoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/enno-oduno/handoff.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAA8B,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEjF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,iBAAiB,GAC3B,kBAAkB,CAgBpB"}
@@ -0,0 +1,18 @@
1
+ import { KiokukoError } from '../errors.js';
2
+ import { ENNO_APPLICABLE_TASK_TYPES } from './types.js';
3
+ export function buildEnnoRequestHandoff(profile, reasoning) {
4
+ if (profile.taskType === null || !ENNO_APPLICABLE_TASK_TYPES.includes(profile.taskType) || reasoning.selectedAction === null) {
5
+ throw new KiokukoError('INTEGRITY_ERROR', 'Akinator did not produce an actionable Enno handoff');
6
+ }
7
+ return {
8
+ sourceRole: 'enno-oduno',
9
+ taskType: profile.taskType,
10
+ objective: reasoning.selectedAction,
11
+ target: profile.target,
12
+ expected: profile.expected,
13
+ constraints: [...reasoning.conditions],
14
+ verification: [...reasoning.verification],
15
+ stopConditions: [...reasoning.stopConditions],
16
+ };
17
+ }
18
+ //# sourceMappingURL=handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/enno-oduno/handoff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAA2B,MAAM,YAAY,CAAC;AAEjF,MAAM,UAAU,uBAAuB,CACrC,OAAoB,EACpB,SAA4B;IAE5B,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CACnE,OAAO,CAAC,QAAuD,CAChE,IAAI,SAAS,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;QACvC,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,qDAAqD,CAAC,CAAC;IACnG,CAAC;IACD,OAAO;QACL,UAAU,EAAE,YAAY;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAuD;QACzE,SAAS,EAAE,SAAS,CAAC,cAAc;QACnC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC;QACtC,YAAY,EAAE,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC;QACzC,cAAc,EAAE,CAAC,GAAG,SAAS,CAAC,cAAc,CAAC;KAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type EnnoClientKind } from './types.js';
2
+ export interface TaskClientHint {
3
+ kind?: string;
4
+ version?: string;
5
+ sessionId?: string;
6
+ }
7
+ export interface TaskClientHintInput {
8
+ kind?: string | undefined;
9
+ version?: string | undefined;
10
+ sessionId?: string | undefined;
11
+ }
12
+ export interface McpClientImplementation {
13
+ name: string;
14
+ title?: string | undefined;
15
+ version: string;
16
+ }
17
+ export declare function identifyEnnoClientKind(value: unknown): EnnoClientKind | null;
18
+ export declare function identifyMcpClientKind(client: McpClientImplementation | undefined): EnnoClientKind | null;
19
+ export declare function resolveTaskPrepareClient(explicit: TaskClientHintInput | undefined, runtime: McpClientImplementation | undefined): TaskClientHint | undefined;
20
+ //# sourceMappingURL=harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/enno-oduno/harness.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAoBD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAI5E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,uBAAuB,GAAG,SAAS,GAAG,cAAc,GAAG,IAAI,CAQxG;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,mBAAmB,GAAG,SAAS,EACzC,OAAO,EAAE,uBAAuB,GAAG,SAAS,GAC3C,cAAc,GAAG,SAAS,CA2B5B"}
@@ -0,0 +1,65 @@
1
+ import { KiokukoError } from '../errors.js';
2
+ import { ENNO_CLIENT_KINDS } from './types.js';
3
+ const CLIENT_ALIASES = {
4
+ codex: ['codex', 'codex-mcp-client'],
5
+ claude: ['claude', 'claude-ai', 'claude-code'],
6
+ opencode: ['opencode'],
7
+ };
8
+ function normalizedClientName(value) {
9
+ if (typeof value !== 'string' || value.length === 0 || value.length > 200
10
+ || value.trim() !== value || /[\p{Cc}\p{Cf}]/u.test(value))
11
+ return null;
12
+ return value.normalize('NFKC').toLowerCase();
13
+ }
14
+ function boundedVersion(value) {
15
+ if (typeof value !== 'string' || value.length === 0 || value.length > 100
16
+ || value.trim() !== value || /[\p{Cc}\p{Cf}]/u.test(value))
17
+ return undefined;
18
+ return value;
19
+ }
20
+ export function identifyEnnoClientKind(value) {
21
+ const normalized = normalizedClientName(value);
22
+ if (normalized === null)
23
+ return null;
24
+ return ENNO_CLIENT_KINDS.find((kind) => CLIENT_ALIASES[kind].includes(normalized)) ?? null;
25
+ }
26
+ export function identifyMcpClientKind(client) {
27
+ if (client === undefined)
28
+ return null;
29
+ const fromName = identifyEnnoClientKind(client.name);
30
+ const fromTitle = identifyEnnoClientKind(client.title);
31
+ if (fromName !== null && fromTitle !== null && fromName !== fromTitle) {
32
+ throw new KiokukoError('CONFLICT', 'MCP client identity is contradictory');
33
+ }
34
+ return fromName ?? fromTitle;
35
+ }
36
+ export function resolveTaskPrepareClient(explicit, runtime) {
37
+ const runtimeKind = identifyMcpClientKind(runtime);
38
+ const explicitKind = identifyEnnoClientKind(explicit?.kind);
39
+ if (runtimeKind !== null && explicit?.kind !== undefined && explicitKind !== runtimeKind) {
40
+ throw new KiokukoError('CONFLICT', 'Explicit client identity conflicts with the MCP client');
41
+ }
42
+ if (runtimeKind !== null) {
43
+ const runtimeVersion = boundedVersion(runtime?.version);
44
+ return {
45
+ kind: runtimeKind,
46
+ ...(runtimeVersion === undefined ? {} : { version: runtimeVersion }),
47
+ ...(explicit?.sessionId === undefined ? {} : { sessionId: explicit.sessionId }),
48
+ };
49
+ }
50
+ if (explicit !== undefined) {
51
+ return {
52
+ ...(explicit.kind === undefined ? {} : { kind: explicit.kind }),
53
+ ...(explicit.version === undefined ? {} : { version: explicit.version }),
54
+ ...(explicit.sessionId === undefined ? {} : { sessionId: explicit.sessionId }),
55
+ };
56
+ }
57
+ if (runtime === undefined)
58
+ return undefined;
59
+ const runtimeVersion = boundedVersion(runtime.version);
60
+ return {
61
+ kind: runtime.name,
62
+ ...(runtimeVersion === undefined ? {} : { version: runtimeVersion }),
63
+ };
64
+ }
65
+ //# sourceMappingURL=harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/enno-oduno/harness.ts"],"names":[],"mappings":"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"}