copperhead 0.10.0 → 0.11.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 (99) hide show
  1. package/README.md +41 -2
  2. package/dist/agent/context.js +2 -0
  3. package/dist/agent/context.js.map +1 -0
  4. package/dist/agent/dock-renderer.js +2 -2
  5. package/dist/agent/dock-renderer.js.map +1 -1
  6. package/dist/agent/envelope.js +105 -0
  7. package/dist/agent/envelope.js.map +1 -0
  8. package/dist/agent/loop.js +34 -14
  9. package/dist/agent/loop.js.map +1 -1
  10. package/dist/agent/providers/claude-code.js +17 -1
  11. package/dist/agent/providers/claude-code.js.map +1 -1
  12. package/dist/agent/providers/codex.js +84 -39
  13. package/dist/agent/providers/codex.js.map +1 -1
  14. package/dist/agent/recovery.js +91 -14
  15. package/dist/agent/recovery.js.map +1 -1
  16. package/dist/agent/registry.js +49 -0
  17. package/dist/agent/registry.js.map +1 -0
  18. package/dist/agent/render.js +2 -2
  19. package/dist/agent/render.js.map +1 -1
  20. package/dist/agent/theme.js +10 -5
  21. package/dist/agent/theme.js.map +1 -1
  22. package/dist/agent/tools.js +99 -769
  23. package/dist/agent/tools.js.map +1 -1
  24. package/dist/capabilities/define.js +35 -0
  25. package/dist/capabilities/define.js.map +1 -0
  26. package/dist/capabilities/handlers.js +744 -0
  27. package/dist/capabilities/handlers.js.map +1 -0
  28. package/dist/capabilities/helpers.js +39 -0
  29. package/dist/capabilities/helpers.js.map +1 -0
  30. package/dist/capabilities/index.js +50 -0
  31. package/dist/capabilities/index.js.map +1 -0
  32. package/dist/capabilities/skills/generate-report.js +23 -0
  33. package/dist/capabilities/skills/generate-report.js.map +1 -0
  34. package/dist/cli.js +84 -1
  35. package/dist/cli.js.map +1 -1
  36. package/dist/commands/create.js +5 -2
  37. package/dist/commands/create.js.map +1 -1
  38. package/dist/commands/doctor.js +33 -3
  39. package/dist/commands/doctor.js.map +1 -1
  40. package/dist/commands/skill.js +109 -0
  41. package/dist/commands/skill.js.map +1 -0
  42. package/dist/commands/sync.js +3 -1
  43. package/dist/commands/sync.js.map +1 -1
  44. package/dist/config.js +18 -6
  45. package/dist/config.js.map +1 -1
  46. package/dist/kicad/cli.js +106 -18
  47. package/dist/kicad/cli.js.map +1 -1
  48. package/dist/kicad/draft/draft.js +3 -0
  49. package/dist/kicad/draft/draft.js.map +1 -1
  50. package/dist/kicad/draft/engine.js +3139 -218
  51. package/dist/kicad/draft/engine.js.map +1 -1
  52. package/dist/kicad/draft/symsource.js +24 -10
  53. package/dist/kicad/draft/symsource.js.map +1 -1
  54. package/dist/kicad/emit.js +45 -6
  55. package/dist/kicad/emit.js.map +1 -1
  56. package/dist/kicad/legibility.js +51 -4
  57. package/dist/kicad/legibility.js.map +1 -1
  58. package/dist/kicad/score.js +173 -3
  59. package/dist/kicad/score.js.map +1 -1
  60. package/dist/kicad/sexp.js +32 -6
  61. package/dist/kicad/sexp.js.map +1 -1
  62. package/dist/mcp/server.js +485 -0
  63. package/dist/mcp/server.js.map +1 -0
  64. package/dist/memory/scaffold.js +8 -1
  65. package/dist/memory/scaffold.js.map +1 -1
  66. package/package.json +5 -2
  67. package/src/agent/context.ts +35 -0
  68. package/src/agent/dock-renderer.ts +3 -2
  69. package/src/agent/envelope.ts +124 -0
  70. package/src/agent/loop.ts +45 -17
  71. package/src/agent/providers/claude-code.ts +22 -1
  72. package/src/agent/providers/codex.ts +91 -42
  73. package/src/agent/recovery.ts +89 -12
  74. package/src/agent/registry.ts +58 -0
  75. package/src/agent/render.ts +4 -3
  76. package/src/agent/theme.ts +15 -5
  77. package/src/agent/tools.ts +124 -816
  78. package/src/agent/types.ts +10 -5
  79. package/src/capabilities/define.ts +88 -0
  80. package/src/capabilities/handlers.ts +769 -0
  81. package/src/capabilities/helpers.ts +37 -0
  82. package/src/capabilities/index.ts +53 -0
  83. package/src/capabilities/skills/generate-report.ts +25 -0
  84. package/src/cli.ts +84 -1
  85. package/src/commands/create.ts +5 -2
  86. package/src/commands/doctor.ts +34 -3
  87. package/src/commands/skill.ts +127 -0
  88. package/src/commands/sync.ts +5 -3
  89. package/src/config.ts +32 -8
  90. package/src/kicad/cli.ts +129 -18
  91. package/src/kicad/draft/draft.ts +2 -0
  92. package/src/kicad/draft/engine.ts +3034 -226
  93. package/src/kicad/draft/symsource.ts +24 -10
  94. package/src/kicad/emit.ts +71 -7
  95. package/src/kicad/legibility.ts +55 -6
  96. package/src/kicad/score.ts +187 -8
  97. package/src/kicad/sexp.ts +37 -6
  98. package/src/mcp/server.ts +560 -0
  99. package/src/memory/scaffold.ts +8 -1
@@ -35,11 +35,16 @@ export interface Turn {
35
35
  export interface ChatOpts {
36
36
  maxTokens?: number;
37
37
  /**
38
- * Liveness callback for the loop's heartbeat (5.1). A streaming provider calls
39
- * it as output arrives, passing the cumulative streamed-output length in chars,
40
- * so a slow turn can be told apart from a hung one. Providers that don't stream
41
- * simply never call it (the heartbeat still reports elapsed time). Never used
42
- * for billing real token usage is reported once, on the returned Turn.
38
+ * Progress callback (5.1). A streaming provider calls it as the turn makes
39
+ * progress, passing the cumulative streamed-output length in chars. The loop
40
+ * uses it twice: the heartbeat shows the count, so a slow turn can be told
41
+ * apart from a hung one, and every call restarts the turn's inactivity
42
+ * watchdog, so a long turn that keeps producing output is not aborted as hung.
43
+ * Call it on any progress (thinking, block boundaries), not only new text; an
44
+ * unchanged count is fine. Providers that don't stream simply never call it
45
+ * (the heartbeat still reports elapsed time, and the watchdog acts as a
46
+ * whole-turn deadline). Never used for billing — real token usage is reported
47
+ * once, on the returned Turn.
43
48
  */
44
49
  onStream?: (streamedChars: number) => void;
45
50
  }
@@ -0,0 +1,88 @@
1
+ import type { ToolSchema } from '../agent/types.js';
2
+ import type { RunContext } from '../agent/context.js';
3
+ import type { ToolResult, ViewHint } from '../agent/envelope.js';
4
+
5
+ export interface CatalogTool {
6
+ kind: 'tool';
7
+ name: string;
8
+ version: number;
9
+ viewHint: ViewHint;
10
+ schema: ToolSchema;
11
+ gate: (ctx: RunContext) => boolean;
12
+ /** Own gate as declared, before the registry applies the tools-conjunction. */
13
+ ownGate: (ctx: RunContext) => boolean;
14
+ handler: (ctx: RunContext, args: Record<string, unknown>) => Promise<ToolResult>;
15
+ }
16
+
17
+ export interface CatalogSkill {
18
+ kind: 'skill';
19
+ name: string;
20
+ version: number;
21
+ viewHint: ViewHint;
22
+ schema: ToolSchema;
23
+ gate: (ctx: RunContext) => boolean;
24
+ ownGate: (ctx: RunContext) => boolean;
25
+ /** False when `gate` was omitted and should default to the tools-conjunction. */
26
+ gateProvided: boolean;
27
+ tools: string[];
28
+ prompt: (ctx: RunContext, args: Record<string, unknown>) => string;
29
+ isComplete: (ctx: RunContext, args: Record<string, unknown>) => Promise<boolean> | boolean;
30
+ maxTurns?: number;
31
+ }
32
+
33
+ export type CatalogEntry = CatalogTool | CatalogSkill;
34
+
35
+ export interface ToolInit {
36
+ schema: ToolSchema;
37
+ version: number;
38
+ viewHint: ViewHint;
39
+ gate: (ctx: RunContext) => boolean;
40
+ handler: (ctx: RunContext, args: Record<string, unknown>) => Promise<ToolResult>;
41
+ }
42
+
43
+ export interface SkillInit {
44
+ schema: ToolSchema;
45
+ version: number;
46
+ viewHint: ViewHint;
47
+ tools: string[];
48
+ prompt: (ctx: RunContext, args: Record<string, unknown>) => string;
49
+ isComplete: (ctx: RunContext, args: Record<string, unknown>) => Promise<boolean> | boolean;
50
+ maxTurns?: number;
51
+ gate?: (ctx: RunContext) => boolean;
52
+ }
53
+
54
+ /** Identity helper: freeze defaults and tag the tier. */
55
+ export function defineTool(def: ToolInit): CatalogTool {
56
+ return {
57
+ kind: 'tool',
58
+ name: def.schema.name,
59
+ version: def.version,
60
+ viewHint: def.viewHint,
61
+ schema: def.schema,
62
+ gate: def.gate,
63
+ ownGate: def.gate,
64
+ handler: def.handler,
65
+ };
66
+ }
67
+
68
+ /**
69
+ * Identity helper. When `gate` is omitted the skill is available only if every
70
+ * declared tool's gate is true (applied by the registry at list-time).
71
+ */
72
+ export function defineSkill(def: SkillInit): CatalogSkill {
73
+ const ownGate = def.gate ?? ((_ctx: RunContext) => true);
74
+ return {
75
+ kind: 'skill',
76
+ name: def.schema.name,
77
+ version: def.version,
78
+ viewHint: def.viewHint,
79
+ schema: def.schema,
80
+ gate: ownGate,
81
+ ownGate,
82
+ gateProvided: def.gate !== undefined,
83
+ tools: def.tools,
84
+ prompt: def.prompt,
85
+ isComplete: def.isComplete,
86
+ ...(def.maxTurns !== undefined ? { maxTurns: def.maxTurns } : {}),
87
+ };
88
+ }