@tea-agent/loop-agent 0.21.0 → 0.23.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.
- package/AGENTS.md +42 -108
- package/CHANGELOG.md +114 -0
- package/README.md +7 -4
- package/bin/agent-worker.js +0 -0
- package/dist/adapters/loop-agent.js +52 -0
- package/dist/application/context-usage/skill-resolution-stats.js +263 -0
- package/dist/application/dag/generate-task-dag.js +17 -3
- package/dist/cli/command-definitions.js +8 -7
- package/dist/cli/program.js +17 -15
- package/dist/commands/doctor.js +269 -18
- package/dist/commands/init.js +198 -86
- package/dist/commands/stats.js +40 -11
- package/dist/executors/dag-pi-executor.js +2 -0
- package/dist/executors/shell-executor.js +162 -19
- package/dist/shared/openspec-spec.js +49 -0
- package/dist/shared/operator/capabilities.js +11 -1
- package/dist/worker/console/app-data.js +4 -0
- package/dist/worker/console/chat/instruction-skills.js +217 -0
- package/dist/worker/console/chat/model-resolver.js +106 -0
- package/dist/worker/console/chat/pi-runtime.js +605 -0
- package/dist/worker/console/chat/resource-loader.js +66 -0
- package/dist/worker/console/chat/routes.js +357 -0
- package/dist/worker/console/chat/session-store.js +238 -0
- package/dist/worker/console/chat/tool-adapter.js +238 -0
- package/dist/worker/console/chat/tools.js +171 -0
- package/dist/worker/console/server.js +55 -0
- package/dist/worker/console/static/assets/index-DVl7Jxt5.js +25 -0
- package/dist/worker/console/static/assets/index-lVcIr9Ju.css +1 -0
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/feature/profile-schema.js +1 -1
- package/dist/worker/observability/read-model.js +21 -1
- package/dist/worker/observe/spec-evidence.js +12 -15
- package/dist/worker/observe/static/dag-helpers.js +22 -0
- package/dist/worker/observe/static/views/dag.js +5 -0
- package/dist/workflows/dag/backend-test-markdown-workflow.js +37 -0
- package/dist/workflows/dag/frontend-implementation-contract.js +141 -32
- package/dist/workflows/dag/frontend-lint-baseline.js +471 -0
- package/dist/workflows/dag/frontend-prewrite-gate.js +79 -16
- package/dist/workflows/dag/frontend-project-capability.js +11 -8
- package/dist/workflows/dag/frontend-repair.js +6 -4
- package/dist/workflows/dag/frontend-review-context.js +67 -0
- package/dist/workflows/dag/frontend-test-case-quality.js +105 -0
- package/dist/workflows/dag/frontend-test-result-contract.js +71 -66
- package/dist/workflows/dag/frontend-verification-trace.js +31 -1
- package/dist/workflows/dag/frontend-worktree-diff.js +81 -6
- package/dist/workflows/dag/init-hybrid.js +412 -84
- package/dist/workflows/dag/node-execution.js +38 -1
- package/dist/workflows/dag/output-protocol.js +89 -0
- package/dist/workflows/dag/prompt.js +35 -1
- package/dist/workflows/dag/recovery-recommendation.js +45 -0
- package/dist/workflows/dag/report.js +28 -1
- package/dist/workflows/dag/rerun-task.js +1 -1
- package/dist/workflows/dag/scheduler.js +9 -0
- package/dist/workflows/dag/types.js +74 -1
- package/dist/workflows/dag/validate.js +55 -0
- package/docs/README.md +73 -156
- package/docs/architecture/README.md +3 -2
- package/docs/architecture/dag-execution.md +2 -2
- package/docs/architecture/evolution.md +14 -12
- package/docs/architecture/system-overview.md +1 -1
- package/docs/architecture/worker-and-feature.md +3 -3
- package/docs/governance/README.md +15 -0
- package/docs/{harness-methodology-debugging.md → governance/harness-methodology-debugging.md} +27 -3
- package/docs/init-surface.manifest.json +22 -4
- package/docs/operations/README.md +12 -0
- package/docs/{local-development-environment.md → operations/local-development-environment.md} +1 -1
- package/docs/skills/vetted-skill-registry.md +23 -3
- package/docs/templates/README.md +55 -0
- package/docs/templates/agent-dag.schema.json +15 -5
- package/docs/templates/backend-test-dag.json +1 -1
- package/docs/templates/evaluation/agents-map-slim-v1.candidate.json +9 -0
- package/docs/templates/evaluation/agents-map-slim-v1.md +87 -0
- package/docs/templates/evaluation/agents-map-verbose-v0.candidate.json +9 -0
- package/docs/templates/evaluation/agents-map-verbose-v0.md +153 -0
- package/docs/templates/frontend-implementation-contract.schema.json +4 -3
- package/docs/templates/frontend-test-case-checklist.md +6 -2
- package/docs/templates/frontend-test-dag.json +2 -2
- package/docs/templates/hybrid-dag.json +1 -1
- package/docs/templates/progress-log.md +9 -2
- package/harness.json +5 -5
- package/package.json +5 -5
- package/scripts/kb-bootstrap-init-skeleton.sh +2 -2
- package/skills/agent-worker/SKILL.md +1 -1
- package/skills/frontend-design-review/SKILL.md +12 -10
- package/skills/frontend-design-review/references/review-checklist.md +4 -4
- package/skills/frontend-implementation/SKILL.md +2 -2
- package/skills/frontend-implementation/references/code-standards.md +4 -3
- package/skills/frontend-implementation/references/design-spec.md +19 -14
- package/skills/frontend-implementation/references/node-contracts.md +2 -2
- package/skills/frontend-review/SKILL.md +15 -28
- package/skills/frontend-review/references/review-findings.md +16 -18
- package/skills/frontend-verification/SKILL.md +16 -13
- package/skills/frontend-verification/references/verification-checklist.md +18 -30
- package/skills/grill-with-docs/SKILL.md +44 -52
- package/skills/grill-with-docs/adr-format.md +37 -26
- package/skills/grill-with-docs/context-format.md +18 -26
- package/skills/loop-agent/SKILL.md +28 -112
- package/skills/loop-agent/references/command-reference.md +9 -3
- package/skills/loop-agent/references/harness-policy.md +3 -3
- package/skills/loop-agent/references/hybrid-dag.md +1 -1
- package/skills/loop-agent/references/orchestrator-and-interventions.md +1 -1
- package/skills/loop-agent/references/task-workflow.md +2 -0
- package/skills/systematic-debugging/SKILL.md +20 -4
- package/skills/test-driven-development/SKILL.md +10 -3
- package/dist/worker/console/static/assets/index-CUDke82y.js +0 -18
- package/dist/worker/console/static/assets/index-wSEksVSO.css +0 -1
- /package/docs/{harness-methodology-tdd.md → governance/harness-methodology-tdd.md} +0 -0
- /package/docs/{harness-methodology-verification.md → governance/harness-methodology-verification.md} +0 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operator Chat — default model resolver (no hardcoded model).
|
|
3
|
+
*
|
|
4
|
+
* Resolves the Chat default model from the repo harness.json `executors.pi.MED`
|
|
5
|
+
* tier, then finds a concrete provider by searching the Pi SDK's
|
|
6
|
+
* `snapshot.available` model list (preferring providers whose model entry is
|
|
7
|
+
* backed by credentials).
|
|
8
|
+
*
|
|
9
|
+
* Rationale: harness.json only stores a modelId per tier (e.g. "gpt-5.5"), not
|
|
10
|
+
* a provider. The Pi SDK `getModel(provider, modelId)` requires a provider, so
|
|
11
|
+
* we search `available` for entries whose `id` matches the modelId and pick the
|
|
12
|
+
* first whose provider resolves to a configured/credentialled source. This
|
|
13
|
+
* mirrors how the user's wizard-local / configured providers surface models.
|
|
14
|
+
*
|
|
15
|
+
* This module is deliberately framework-light: it takes a repoRoot + an
|
|
16
|
+
* optional model-list snapshot and returns a `{provider, modelId}` descriptor.
|
|
17
|
+
* The Pi runtime layer turns that into a concrete SDK model via getModel.
|
|
18
|
+
*/
|
|
19
|
+
import { readFile } from "node:fs/promises";
|
|
20
|
+
import path from "node:path";
|
|
21
|
+
/** Tier keys in harness executors.pi that may override the default. */
|
|
22
|
+
const EXECUTOR_TIERS = ["LOW", "MED", "HIGH"];
|
|
23
|
+
/**
|
|
24
|
+
* Read executors.pi.<tier> from the repo harness.json. Returns undefined when
|
|
25
|
+
* harness.json is absent or the tier is unset / "default" sentinel.
|
|
26
|
+
*
|
|
27
|
+
* Default tier = MED (matches DAG executor model matrix convention).
|
|
28
|
+
*/
|
|
29
|
+
export async function readHarnessPiModelTier(repoRoot, tier = "MED") {
|
|
30
|
+
try {
|
|
31
|
+
const raw = await readFile(path.join(repoRoot, "harness.json"), "utf-8");
|
|
32
|
+
const manifest = JSON.parse(raw);
|
|
33
|
+
const pi = manifest.executors?.pi;
|
|
34
|
+
if (!pi)
|
|
35
|
+
return undefined;
|
|
36
|
+
const tierValue = pi[tier];
|
|
37
|
+
if (tierValue && tierValue !== "default")
|
|
38
|
+
return tierValue;
|
|
39
|
+
const defaultModel = pi.defaultModel;
|
|
40
|
+
if (defaultModel && defaultModel !== "default")
|
|
41
|
+
return defaultModel;
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Search the SDK's available-model list for entries matching a modelId.
|
|
50
|
+
*
|
|
51
|
+
* Matching rule: an entry matches when its `id` equals the modelId OR equals
|
|
52
|
+
* `<provider>/<modelId>` (SDK lists both bare and provider-prefixed ids).
|
|
53
|
+
*
|
|
54
|
+
* Provider preference (in order):
|
|
55
|
+
* 1. Bare-id entries (`id === modelId`) — these are the user's own provider
|
|
56
|
+
* config (e.g. wizard-local registering `gpt-5.5`), preferred over
|
|
57
|
+
* aggregator reseller entries (`openai/gpt-5.5` from openrouter).
|
|
58
|
+
* 2. Among matches, prefer those flagged hasCredentials=true (provider is
|
|
59
|
+
* in the SDK's configuredProviders set).
|
|
60
|
+
* 3. Stable list order otherwise.
|
|
61
|
+
*/
|
|
62
|
+
export function findProviderForModelId(modelId, available) {
|
|
63
|
+
const matches = available.filter((m) => {
|
|
64
|
+
if (m.id === modelId)
|
|
65
|
+
return true;
|
|
66
|
+
if (m.id === `${m.provider}/${modelId}`)
|
|
67
|
+
return true;
|
|
68
|
+
const slash = m.id.lastIndexOf("/");
|
|
69
|
+
if (slash >= 0 && m.id.slice(slash + 1) === modelId)
|
|
70
|
+
return true;
|
|
71
|
+
return false;
|
|
72
|
+
});
|
|
73
|
+
if (matches.length === 0)
|
|
74
|
+
return undefined;
|
|
75
|
+
// Score: bare-id (0) beats prefixed (1); then hasCredentials wins; then order.
|
|
76
|
+
const score = (m) => {
|
|
77
|
+
let s = 0;
|
|
78
|
+
if (m.id !== modelId)
|
|
79
|
+
s += 1; // prefixed id is less preferred
|
|
80
|
+
if (m.hasCredentials !== true)
|
|
81
|
+
s += 2; // no credentials is less preferred
|
|
82
|
+
return s;
|
|
83
|
+
};
|
|
84
|
+
return [...matches].sort((a, b) => score(a) - score(b))[0];
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve the Chat default model descriptor. Returns undefined when no model
|
|
88
|
+
* can be resolved (harness unset + no snapshot match).
|
|
89
|
+
*
|
|
90
|
+
* @param repoRoot repo with harness.json
|
|
91
|
+
* @param available SDK snapshot.available (already mapped to AvailableModelEntry)
|
|
92
|
+
* @param options.tier harness tier to read (default MED)
|
|
93
|
+
*/
|
|
94
|
+
export async function resolveDefaultChatModel(repoRoot, available, options) {
|
|
95
|
+
const modelId = await readHarnessPiModelTier(repoRoot, options?.tier ?? "MED");
|
|
96
|
+
if (!modelId)
|
|
97
|
+
return undefined;
|
|
98
|
+
const entry = findProviderForModelId(modelId, available);
|
|
99
|
+
if (!entry)
|
|
100
|
+
return undefined;
|
|
101
|
+
return {
|
|
102
|
+
provider: entry.provider,
|
|
103
|
+
modelId,
|
|
104
|
+
label: entry.name,
|
|
105
|
+
};
|
|
106
|
+
}
|