@plurnk/plurnk-service 1.7.0 → 1.8.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.
- package/.env.defaults +29 -42
- package/INSTALL.md +49 -10
- package/README.md +11 -1
- package/SPEC.md +631 -279
- package/digest-sql/channel-dispositions/dispositions.sql +15 -0
- package/digest-sql/channel-state/state.sql +6 -0
- package/digest-sql/curation/curation.sql +5 -0
- package/digest-sql/derivations/derivations.sql +4 -0
- package/digest-sql/embeddings/embeddings.sql +4 -0
- package/digest-sql/entry-dispositions/dispositions.sql +15 -0
- package/digest-sql/entry-state/state.sql +6 -0
- package/digest-sql/token-counts/token-counts.sql +2 -0
- package/dist/Paths.d.ts +2 -5
- package/dist/Paths.d.ts.map +1 -1
- package/dist/Paths.js +9 -21
- package/dist/Paths.js.map +1 -1
- package/dist/build-info.json +1 -1
- package/dist/content/read-projector.d.ts.map +1 -1
- package/dist/content/read-projector.js +4 -3
- package/dist/content/read-projector.js.map +1 -1
- package/dist/core/BudgetReadout.d.ts.map +1 -1
- package/dist/core/BudgetReadout.js +12 -22
- package/dist/core/BudgetReadout.js.map +1 -1
- package/dist/core/ChannelWrite.d.ts.map +1 -1
- package/dist/core/ChannelWrite.js.map +1 -1
- package/dist/core/ChannelWrite.sql +2 -1
- package/dist/core/Dispatcher.d.ts +7 -6
- package/dist/core/Dispatcher.d.ts.map +1 -1
- package/dist/core/Dispatcher.js +34 -88
- package/dist/core/Dispatcher.js.map +1 -1
- package/dist/core/Engine.d.ts +11 -8
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/Engine.js +45 -27
- package/dist/core/Engine.js.map +1 -1
- package/dist/core/Engine.sql +112 -107
- package/dist/core/ExecutorRegistry.d.ts +8 -2
- package/dist/core/ExecutorRegistry.d.ts.map +1 -1
- package/dist/core/ExecutorRegistry.js +6 -3
- package/dist/core/ExecutorRegistry.js.map +1 -1
- package/dist/core/HostPaths.d.ts +29 -0
- package/dist/core/HostPaths.d.ts.map +1 -0
- package/dist/core/HostPaths.js +74 -0
- package/dist/core/HostPaths.js.map +1 -0
- package/dist/core/LegacyHome.d.ts +10 -0
- package/dist/core/LegacyHome.d.ts.map +1 -0
- package/dist/core/LegacyHome.js +170 -0
- package/dist/core/LegacyHome.js.map +1 -0
- package/dist/core/LogBody.d.ts +1 -1
- package/dist/core/LogBody.d.ts.map +1 -1
- package/dist/core/LogBody.js +2 -2
- package/dist/core/LogBody.js.map +1 -1
- package/dist/core/LogEntryProjection.js +1 -1
- package/dist/core/LogEntryProjection.js.map +1 -1
- package/dist/core/LogVisibility.d.ts +28 -0
- package/dist/core/LogVisibility.d.ts.map +1 -0
- package/dist/core/LogVisibility.js +215 -0
- package/dist/core/LogVisibility.js.map +1 -0
- package/dist/core/LoopLifecycle.d.ts +1 -0
- package/dist/core/LoopLifecycle.d.ts.map +1 -1
- package/dist/core/LoopLifecycle.js +8 -0
- package/dist/core/LoopLifecycle.js.map +1 -1
- package/dist/core/LoopLifecycle.sql +10 -0
- package/dist/core/OperatorConfig.d.ts +6 -0
- package/dist/core/OperatorConfig.d.ts.map +1 -0
- package/dist/core/OperatorConfig.js +92 -0
- package/dist/core/OperatorConfig.js.map +1 -0
- package/dist/core/OverflowTurn.d.ts +11 -0
- package/dist/core/OverflowTurn.d.ts.map +1 -0
- package/dist/core/OverflowTurn.js +77 -0
- package/dist/core/OverflowTurn.js.map +1 -0
- package/dist/core/Owner.js +2 -2
- package/dist/core/Owner.js.map +1 -1
- package/dist/core/PacketBuilder.d.ts +3 -15
- package/dist/core/PacketBuilder.d.ts.map +1 -1
- package/dist/core/PacketBuilder.js +48 -121
- package/dist/core/PacketBuilder.js.map +1 -1
- package/dist/core/ProblemLog.js +1 -1
- package/dist/core/ProblemLog.js.map +1 -1
- package/dist/core/ProposalLifecycle.d.ts.map +1 -1
- package/dist/core/ProposalLifecycle.js +3 -23
- package/dist/core/ProposalLifecycle.js.map +1 -1
- package/dist/core/ProviderInstantiate.d.ts +9 -5
- package/dist/core/ProviderInstantiate.d.ts.map +1 -1
- package/dist/core/ProviderInstantiate.js +99 -104
- package/dist/core/ProviderInstantiate.js.map +1 -1
- package/dist/core/ResourceMutations.d.ts.map +1 -1
- package/dist/core/ResourceMutations.js +5 -3
- package/dist/core/ResourceMutations.js.map +1 -1
- package/dist/core/SchemeRegistry.d.ts +0 -1
- package/dist/core/SchemeRegistry.d.ts.map +1 -1
- package/dist/core/SchemeRegistry.js +7 -11
- package/dist/core/SchemeRegistry.js.map +1 -1
- package/dist/core/ToolResources.d.ts +19 -0
- package/dist/core/ToolResources.d.ts.map +1 -0
- package/dist/core/ToolResources.js +122 -0
- package/dist/core/ToolResources.js.map +1 -0
- package/dist/core/Turn.d.ts +27 -0
- package/dist/core/Turn.d.ts.map +1 -0
- package/dist/core/Turn.js +43 -0
- package/dist/core/Turn.js.map +1 -0
- package/dist/core/Turn.sql +72 -0
- package/dist/core/TurnOps.d.ts +7 -0
- package/dist/core/TurnOps.d.ts.map +1 -0
- package/dist/core/TurnOps.js +63 -0
- package/dist/core/TurnOps.js.map +1 -0
- package/dist/core/TurnRunner.d.ts +12 -4
- package/dist/core/TurnRunner.d.ts.map +1 -1
- package/dist/core/TurnRunner.js +1045 -898
- package/dist/core/TurnRunner.js.map +1 -1
- package/dist/core/WorkerName.d.ts +1 -1
- package/dist/core/WorkerName.d.ts.map +1 -1
- package/dist/core/env-defaults.d.ts.map +1 -1
- package/dist/core/env-defaults.js +7 -5
- package/dist/core/env-defaults.js.map +1 -1
- package/dist/core/fork.d.ts.map +1 -1
- package/dist/core/fork.js +15 -4
- package/dist/core/fork.js.map +1 -1
- package/dist/core/fork.sql +57 -27
- package/dist/core/git-env.d.ts +0 -1
- package/dist/core/git-env.d.ts.map +1 -1
- package/dist/core/git-env.js +0 -3
- package/dist/core/git-env.js.map +1 -1
- package/dist/core/git-membership.d.ts.map +1 -1
- package/dist/core/git-membership.js +10 -26
- package/dist/core/git-membership.js.map +1 -1
- package/dist/core/git-state.d.ts.map +1 -1
- package/dist/core/git-state.js +13 -14
- package/dist/core/git-state.js.map +1 -1
- package/dist/core/operation-target-groups.d.ts +3 -0
- package/dist/core/operation-target-groups.d.ts.map +1 -0
- package/dist/core/operation-target-groups.js +53 -0
- package/dist/core/operation-target-groups.js.map +1 -0
- package/dist/core/packet-inject.d.ts +0 -1
- package/dist/core/packet-inject.d.ts.map +1 -1
- package/dist/core/packet-inject.js +6 -13
- package/dist/core/packet-inject.js.map +1 -1
- package/dist/core/packet-wire.d.ts +4 -0
- package/dist/core/packet-wire.d.ts.map +1 -1
- package/dist/core/packet-wire.js +208 -44
- package/dist/core/packet-wire.js.map +1 -1
- package/dist/core/plurnk-uri.d.ts +1 -1
- package/dist/core/plurnk-uri.d.ts.map +1 -1
- package/dist/core/plurnk-uri.js +3 -3
- package/dist/core/plurnk-uri.js.map +1 -1
- package/dist/core/teaching.d.ts.map +1 -1
- package/dist/core/teaching.js +4 -5
- package/dist/core/teaching.js.map +1 -1
- package/dist/core/worker-settings.d.ts +9 -0
- package/dist/core/worker-settings.d.ts.map +1 -0
- package/dist/core/worker-settings.js +25 -0
- package/dist/core/worker-settings.js.map +1 -0
- package/dist/core/workspace-settings.d.ts +0 -11
- package/dist/core/workspace-settings.d.ts.map +1 -1
- package/dist/core/workspace-settings.js +3 -47
- package/dist/core/workspace-settings.js.map +1 -1
- package/dist/digest/Digest.d.ts.map +1 -1
- package/dist/digest/Digest.js +164 -92
- package/dist/digest/Digest.js.map +1 -1
- package/dist/digest/digest.sql +8 -2
- package/dist/observe/genai.d.ts +9 -0
- package/dist/observe/genai.d.ts.map +1 -0
- package/dist/observe/genai.js +31 -0
- package/dist/observe/genai.js.map +1 -0
- package/dist/observe/spans.d.ts +3 -3
- package/dist/observe/spans.d.ts.map +1 -1
- package/dist/observe/spans.js +20 -5
- package/dist/observe/spans.js.map +1 -1
- package/dist/schemes/EffectPolicy.d.ts +3 -0
- package/dist/schemes/EffectPolicy.d.ts.map +1 -1
- package/dist/schemes/EffectPolicy.js +38 -6
- package/dist/schemes/EffectPolicy.js.map +1 -1
- package/dist/schemes/Exec.d.ts.map +1 -1
- package/dist/schemes/Exec.js +55 -13
- package/dist/schemes/Exec.js.map +1 -1
- package/dist/schemes/Log.d.ts +6 -2
- package/dist/schemes/Log.d.ts.map +1 -1
- package/dist/schemes/Log.js +73 -22
- package/dist/schemes/Log.js.map +1 -1
- package/dist/schemes/Log.sql +25 -7
- package/dist/schemes/Prompt.d.ts.map +1 -1
- package/dist/schemes/Prompt.js +1 -2
- package/dist/schemes/Prompt.js.map +1 -1
- package/dist/schemes/QuestionTool.d.ts +10 -0
- package/dist/schemes/QuestionTool.d.ts.map +1 -0
- package/dist/schemes/QuestionTool.js +81 -0
- package/dist/schemes/QuestionTool.js.map +1 -0
- package/dist/schemes/Skill.d.ts.map +1 -1
- package/dist/schemes/Skill.js +4 -1
- package/dist/schemes/Skill.js.map +1 -1
- package/dist/schemes/Worker.d.ts.map +1 -1
- package/dist/schemes/Worker.js +20 -3
- package/dist/schemes/Worker.js.map +1 -1
- package/dist/schemes/_entry-crud.sql +19 -1
- package/dist/schemes/_entry-find.d.ts +5 -3
- package/dist/schemes/_entry-find.d.ts.map +1 -1
- package/dist/schemes/_entry-find.js +102 -22
- package/dist/schemes/_entry-find.js.map +1 -1
- package/dist/schemes/_entry-find.sql +8 -6
- package/dist/schemes/_entry-graph.sql +2 -6
- package/dist/schemes/_entry-manifest.d.ts.map +1 -1
- package/dist/schemes/_entry-manifest.js +12 -1
- package/dist/schemes/_entry-manifest.js.map +1 -1
- package/dist/schemes/_search-index.d.ts.map +1 -1
- package/dist/schemes/_search-index.js +37 -25
- package/dist/schemes/_search-index.js.map +1 -1
- package/dist/server/Daemon.d.ts +58 -7
- package/dist/server/Daemon.d.ts.map +1 -1
- package/dist/server/Daemon.js +551 -113
- package/dist/server/Daemon.js.map +1 -1
- package/dist/server/DrainSupervisor.d.ts +12 -9
- package/dist/server/DrainSupervisor.d.ts.map +1 -1
- package/dist/server/DrainSupervisor.js +59 -10
- package/dist/server/DrainSupervisor.js.map +1 -1
- package/dist/server/client-input.d.ts +5 -2
- package/dist/server/client-input.d.ts.map +1 -1
- package/dist/server/client-input.js +53 -34
- package/dist/server/client-input.js.map +1 -1
- package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
- package/dist/server/dispatch-as-plurnk.js +28 -6
- package/dist/server/dispatch-as-plurnk.js.map +1 -1
- package/dist/server/drain.sql +26 -11
- package/dist/server/envelope.d.ts +1 -1
- package/dist/server/envelope.d.ts.map +1 -1
- package/dist/server/envelope.js +4 -4
- package/dist/server/envelope.js.map +1 -1
- package/dist/server/envelope.sql +25 -1
- package/dist/server/lifecycle-recovery.sql +11 -1
- package/dist/server/logEntry.d.ts +2 -1
- package/dist/server/logEntry.d.ts.map +1 -1
- package/dist/server/logEntry.js +3 -2
- package/dist/server/logEntry.js.map +1 -1
- package/dist/server/logEntry.sql +7 -0
- package/dist/server/loop-model.d.ts +2 -2
- package/dist/server/loop-model.d.ts.map +1 -1
- package/dist/server/loop-model.js +23 -33
- package/dist/server/loop-model.js.map +1 -1
- package/dist/server/loopDocs.d.ts.map +1 -1
- package/dist/server/loopDocs.js +61 -10
- package/dist/server/loopDocs.js.map +1 -1
- package/dist/server/loopDocs.sql +4 -2
- package/dist/server/model-catalog.d.ts +3 -0
- package/dist/server/model-catalog.d.ts.map +1 -0
- package/dist/server/model-catalog.js +83 -0
- package/dist/server/model-catalog.js.map +1 -0
- package/dist/server/model-route.d.ts +7 -0
- package/dist/server/model-route.d.ts.map +1 -0
- package/dist/server/model-route.js +47 -0
- package/dist/server/model-route.js.map +1 -0
- package/dist/server/module-discovery.d.ts +13 -0
- package/dist/server/module-discovery.d.ts.map +1 -0
- package/dist/server/module-discovery.js +78 -0
- package/dist/server/module-discovery.js.map +1 -0
- package/dist/server/skillDocs.d.ts +9 -0
- package/dist/server/skillDocs.d.ts.map +1 -0
- package/dist/server/skillDocs.js +212 -0
- package/dist/server/skillDocs.js.map +1 -0
- package/dist/server/skillDocs.sql +14 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +182 -123
- package/dist/service.js.map +1 -1
- package/migrations/001_schema.sql +424 -65
- package/package.json +37 -37
- package/dist/core/ExecutableTools.d.ts +0 -11
- package/dist/core/ExecutableTools.d.ts.map +0 -1
- package/dist/core/ExecutableTools.js +0 -49
- package/dist/core/ExecutableTools.js.map +0 -1
- package/dist/core/JournalTurn.d.ts +0 -9
- package/dist/core/JournalTurn.d.ts.map +0 -1
- package/dist/core/JournalTurn.js +0 -14
- package/dist/core/JournalTurn.js.map +0 -1
- package/dist/core/JournalTurn.sql +0 -10
- package/dist/core/git-iso.d.ts +0 -13
- package/dist/core/git-iso.d.ts.map +0 -1
- package/dist/core/git-iso.js +0 -267
- package/dist/core/git-iso.js.map +0 -1
- package/dist/core/search-gate.d.ts +0 -17
- package/dist/core/search-gate.d.ts.map +0 -1
- package/dist/core/search-gate.js +0 -77
- package/dist/core/search-gate.js.map +0 -1
- package/dist/digest/Digest.sql +0 -1
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { access, mkdir, readFile, rmdir, unlink, writeFile } from "node:fs/promises";
|
|
3
|
+
const exists = async (path) => access(path, constants.F_OK)
|
|
4
|
+
.then(() => true)
|
|
5
|
+
.catch(() => false);
|
|
6
|
+
// {§operator-config-discovery} — the user owns this one ordinary dotenv file.
|
|
7
|
+
// Package defaults remain package-owned and are projected on demand.
|
|
8
|
+
export default class OperatorConfig {
|
|
9
|
+
static renderSeed() {
|
|
10
|
+
return [
|
|
11
|
+
"# Plurnk user configuration. This file is yours and is never overwritten.",
|
|
12
|
+
"# Full installed options: plurnk-service config defaults",
|
|
13
|
+
"# Validate this cascade: plurnk-service config check",
|
|
14
|
+
"#",
|
|
15
|
+
"# Choose one model profile by uncommenting its complete block.",
|
|
16
|
+
"",
|
|
17
|
+
"# PLURNK.AI — the proprietary Plurnk endpoint.",
|
|
18
|
+
"# PLURNK_MODEL_plurnk=\"plurnk/plurnk\"",
|
|
19
|
+
"# PLURNK_API_KEY=\"...\"",
|
|
20
|
+
"# PLURNK_MODEL=plurnk",
|
|
21
|
+
"",
|
|
22
|
+
"# OPENROUTER — bring any supported OpenRouter model.",
|
|
23
|
+
"# PLURNK_MODEL_openrouter=\"openrouter/qwen/qwen3-coder\"",
|
|
24
|
+
"# OPENROUTER_API_KEY=\"...\"",
|
|
25
|
+
"# PLURNK_MODEL=openrouter",
|
|
26
|
+
"",
|
|
27
|
+
"# LOCAL QWEN — an OpenAI-compatible llama-server with the Qwen GBNF rail.",
|
|
28
|
+
"# PLURNK_MODEL_local=\"openai/qwen\"",
|
|
29
|
+
"# PLURNK_BASEURL_local=http://127.0.0.1:8080/v1",
|
|
30
|
+
"# PLURNK_PROVIDERS_GBNF_local=plurnk.qwen.gbnf",
|
|
31
|
+
"# PLURNK_MODEL=local",
|
|
32
|
+
"",
|
|
33
|
+
"# FIND-SKILLS ships enabled inside Plurnk. Project skills live in",
|
|
34
|
+
"# .agents/skills; user-global skills live in ~/.agents/skills.",
|
|
35
|
+
"",
|
|
36
|
+
"# OPTIONAL BRAVE SEARCH MCP — uncomment the complete block and provide the key.",
|
|
37
|
+
"# BRAVE_API_KEY=\"...\"",
|
|
38
|
+
"# PLURNK_MCP_BRAVE=npx",
|
|
39
|
+
"# PLURNK_MCP_BRAVE_ARGS=[\"-y\",\"@brave/brave-search-mcp-server@2.1.0\"]",
|
|
40
|
+
"# PLURNK_MCP_BRAVE_ENV={\"BRAVE_API_KEY\":\"${BRAVE_API_KEY}\"}",
|
|
41
|
+
"# PLURNK_MCP_BRAVE_TOOLS=[\"brave_web_search\",\"brave_news_search\"]",
|
|
42
|
+
"# PLURNK_MCP_BRAVE_READ=[\"brave_web_search\",\"brave_news_search\"]",
|
|
43
|
+
"# PLURNK_MCP_ENABLED=[\"brave\"]",
|
|
44
|
+
"",
|
|
45
|
+
"# OPTIONAL TAVILY HTML MATERIALIZATION — install",
|
|
46
|
+
"# @plurnk/plurnk-schemes-http-tavily, then uncomment both lines.",
|
|
47
|
+
"# TAVILY_API_KEY=\"...\"",
|
|
48
|
+
"# PLURNK_SCHEMES_HTTP_MATERIALIZER=tavily-extract",
|
|
49
|
+
"",
|
|
50
|
+
].join("\n");
|
|
51
|
+
}
|
|
52
|
+
static async ensure(paths, policySource) {
|
|
53
|
+
if (await exists(paths.configDir))
|
|
54
|
+
return false;
|
|
55
|
+
const policy = await readFile(policySource, "utf8");
|
|
56
|
+
const firstCreated = await mkdir(paths.configDir, { recursive: true, mode: 0o700 });
|
|
57
|
+
const createdFiles = [];
|
|
58
|
+
try {
|
|
59
|
+
await writeFile(paths.configFile, OperatorConfig.renderSeed(), { encoding: "utf8", flag: "wx", mode: 0o600 });
|
|
60
|
+
createdFiles.push(paths.configFile);
|
|
61
|
+
await writeFile(paths.policyFile, policy, { encoding: "utf8", flag: "wx", mode: 0o600 });
|
|
62
|
+
createdFiles.push(paths.policyFile);
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
catch (cause) {
|
|
66
|
+
const rollbackErrors = [];
|
|
67
|
+
for (const file of createdFiles.toReversed()) {
|
|
68
|
+
try {
|
|
69
|
+
await unlink(file);
|
|
70
|
+
}
|
|
71
|
+
catch (rollbackCause) {
|
|
72
|
+
if (rollbackCause.code !== "ENOENT")
|
|
73
|
+
rollbackErrors.push(rollbackCause);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (firstCreated !== undefined) {
|
|
77
|
+
try {
|
|
78
|
+
await rmdir(paths.configDir);
|
|
79
|
+
}
|
|
80
|
+
catch (rollbackCause) {
|
|
81
|
+
if (rollbackCause.code !== "ENOENT")
|
|
82
|
+
rollbackErrors.push(rollbackCause);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (rollbackErrors.length > 0) {
|
|
86
|
+
throw new AggregateError([cause, ...rollbackErrors], "operator config bootstrap failed and rollback was incomplete");
|
|
87
|
+
}
|
|
88
|
+
throw cause;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=OperatorConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OperatorConfig.js","sourceRoot":"","sources":["../../src/core/OperatorConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type FoldStatement, type PlanStatement, type SendStatement } from "@plurnk/plurnk-contracts";
|
|
2
|
+
import type { Db } from "./Db.ts";
|
|
3
|
+
export type OverflowFold = {
|
|
4
|
+
readonly statement: FoldStatement;
|
|
5
|
+
};
|
|
6
|
+
export default class OverflowTurn {
|
|
7
|
+
static plan(db: Db, loopId: number, turnId: number): Promise<OverflowFold[]>;
|
|
8
|
+
static planStatement(): PlanStatement;
|
|
9
|
+
static sendStatement(): SendStatement;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=OverflowTurn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OverflowTurn.d.ts","sourceRoot":"","sources":["../../src/core/OverflowTurn.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,aAAa,EAErB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAkBlC,MAAM,MAAM,YAAY,GAAG;IACvB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;CACrC,CAAC;AAoCF,MAAM,CAAC,OAAO,OAAO,YAAY;IAC7B,OAAa,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAmBjF;IAED,MAAM,CAAC,aAAa,IAAI,aAAa,CAOpC;IAED,MAAM,CAAC,aAAa,IAAI,aAAa,CAUpC;CACJ"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { UNKNOWN_POSITION, } from "@plurnk/plurnk-contracts";
|
|
2
|
+
import LogBody from "./LogBody.js";
|
|
3
|
+
import LogEntryProjection from "./LogEntryProjection.js";
|
|
4
|
+
import LogVisibility from "./LogVisibility.js";
|
|
5
|
+
const OVERFLOW_PLAN = "Automatically FOLD log bodies newly active at token-budget overflow.";
|
|
6
|
+
const OVERFLOW_SEND = "Next: YOU MUST ONLY FOLD, KILL, or trim ALL superseded, stale, or irrelevant log content in bulk in the next turn.";
|
|
7
|
+
const targetFor = (coordinate) => ({
|
|
8
|
+
kind: "url",
|
|
9
|
+
raw: `log:///${coordinate}`,
|
|
10
|
+
scheme: "log",
|
|
11
|
+
username: null,
|
|
12
|
+
password: null,
|
|
13
|
+
hostname: null,
|
|
14
|
+
port: null,
|
|
15
|
+
pathname: `/${coordinate}`,
|
|
16
|
+
query: null,
|
|
17
|
+
fragment: null,
|
|
18
|
+
});
|
|
19
|
+
const foldFor = (row) => {
|
|
20
|
+
const coordinate = LogEntryProjection.coordinate(row.coordinate, row);
|
|
21
|
+
const statement = {
|
|
22
|
+
op: "FOLD",
|
|
23
|
+
annotation: null,
|
|
24
|
+
delimiter: "",
|
|
25
|
+
signal: ["+_plurnk", "+overflow"],
|
|
26
|
+
target: targetFor(coordinate),
|
|
27
|
+
lineMarker: { marks: [1, -1] },
|
|
28
|
+
body: null,
|
|
29
|
+
position: UNKNOWN_POSITION,
|
|
30
|
+
};
|
|
31
|
+
return { statement };
|
|
32
|
+
};
|
|
33
|
+
// {§overflow-turn-curation} — deterministic selection only. Execution remains
|
|
34
|
+
// ordinary Dispatcher FOLD, so Log owns the visibility transaction and effect
|
|
35
|
+
// evidence exactly as it does for model-authored curation.
|
|
36
|
+
export default class OverflowTurn {
|
|
37
|
+
static async plan(db, loopId, turnId) {
|
|
38
|
+
const causalRows = await db.overflow_turn_causal_rows.all({
|
|
39
|
+
loop_id: loopId,
|
|
40
|
+
turn_id: turnId,
|
|
41
|
+
});
|
|
42
|
+
return causalRows.flatMap((row) => {
|
|
43
|
+
const body = LogBody.resolve({
|
|
44
|
+
op: row.op,
|
|
45
|
+
attrs: row.attrs,
|
|
46
|
+
tx: row.tx,
|
|
47
|
+
rx: row.rx,
|
|
48
|
+
mimetypeTx: row.mimetype_tx,
|
|
49
|
+
mimetypeRx: row.mimetype_rx,
|
|
50
|
+
});
|
|
51
|
+
const lines = LogVisibility.lineCount(body.content);
|
|
52
|
+
return lines === 0 || LogVisibility.fullyFolded(LogVisibility.parse(row.folded), lines)
|
|
53
|
+
? []
|
|
54
|
+
: [foldFor(row)];
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
static planStatement() {
|
|
58
|
+
return {
|
|
59
|
+
op: "PLAN", delimiter: "", annotation: null,
|
|
60
|
+
signal: null, target: null, lineMarker: null,
|
|
61
|
+
body: OVERFLOW_PLAN,
|
|
62
|
+
position: UNKNOWN_POSITION,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
static sendStatement() {
|
|
66
|
+
return {
|
|
67
|
+
op: "SEND", delimiter: "", annotation: null,
|
|
68
|
+
signal: 102, target: null, lineMarker: null,
|
|
69
|
+
body: {
|
|
70
|
+
raw: OVERFLOW_SEND,
|
|
71
|
+
json: null,
|
|
72
|
+
},
|
|
73
|
+
position: UNKNOWN_POSITION,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=OverflowTurn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OverflowTurn.js","sourceRoot":"","sources":["../../src/core/OverflowTurn.ts"],"names":[],"mappings":"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"}
|
package/dist/core/Owner.js
CHANGED
|
@@ -11,7 +11,7 @@ export default class Owner {
|
|
|
11
11
|
const existing = await db.envelope_get_worker_by_name.get({ workspace_id: workspaceId, name: "commons" });
|
|
12
12
|
if (existing !== undefined)
|
|
13
13
|
return existing.id;
|
|
14
|
-
const created = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: "commons", origin: "
|
|
14
|
+
const created = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: "commons", origin: "_plurnk" });
|
|
15
15
|
if (created === undefined)
|
|
16
16
|
throw new Error("Owner.commonsId: commons worker insert returned no row");
|
|
17
17
|
return created.id;
|
|
@@ -21,7 +21,7 @@ export default class Owner {
|
|
|
21
21
|
const existing = await db.envelope_get_worker_by_name.get({ workspace_id: workspaceId, name: "plurnk" });
|
|
22
22
|
if (existing !== undefined)
|
|
23
23
|
return existing.id;
|
|
24
|
-
const created = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: "plurnk", origin: "
|
|
24
|
+
const created = await db.envelope_insert_worker.get({ workspace_id: workspaceId, name: "plurnk", origin: "_plurnk" });
|
|
25
25
|
if (created === undefined)
|
|
26
26
|
throw new Error("Owner.kernelId: kernel worker insert returned no row");
|
|
27
27
|
return created.id;
|
package/dist/core/Owner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Owner.js","sourceRoot":"","sources":["../../src/core/Owner.ts"],"names":[],"mappings":"AAGA,yEAAyE;AACzE,gGAAgG;AAChG,iGAAiG;AACjG,iGAAiG;AACjG,0FAA0F;AAC1F,MAAM,CAAC,OAAO,OAAO,KAAK;IACtB,0FAA0F;IAC1F,yFAAyF;IACzF,uEAAuE;IACvE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAM,EAAE,WAAmB;QAC9C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,2BAA2B,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1H,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"Owner.js","sourceRoot":"","sources":["../../src/core/Owner.ts"],"names":[],"mappings":"AAGA,yEAAyE;AACzE,gGAAgG;AAChG,iGAAiG;AACjG,iGAAiG;AACjG,0FAA0F;AAC1F,MAAM,CAAC,OAAO,OAAO,KAAK;IACtB,0FAA0F;IAC1F,yFAAyF;IACzF,uEAAuE;IACvE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAM,EAAE,WAAmB;QAC9C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,2BAA2B,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1H,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACvI,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACrG,OAAO,OAAO,CAAC,EAAE,CAAC;IACtB,CAAC;IAED,2FAA2F;IAC3F,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAM,EAAE,WAAmB;QAC7C,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,2BAA2B,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzH,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACtI,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACnG,OAAO,OAAO,CAAC,EAAE,CAAC;IACtB,CAAC;IAED,yFAAyF;IACzF,2FAA2F;IAC3F,wFAAwF;IACxF,yFAAyF;IACzF,kCAAkC;IAClC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAmC,EAAE,GAAwB;QACzF,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE;YAAE,OAAO,GAAG,CAAC,QAAQ,CAAC;QACxF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,sBAAsB,CAAC,GAAG,CAAiB,EAAE,YAAY,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzH,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACrC,IAAI,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,yBAAyB,CAAC,GAAG,CAAwB,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrI,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,CAAC;CACJ"}
|
|
@@ -32,23 +32,11 @@ export default class PacketBuilder {
|
|
|
32
32
|
transientOpenLogEntryId?: number | null;
|
|
33
33
|
promptProjection?: "automatic" | "withheld";
|
|
34
34
|
}): Promise<RequestPacket>;
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
referenceEntries(workspaceId: number): Promise<Array<{
|
|
36
|
+
pathname: string;
|
|
37
37
|
content: string;
|
|
38
38
|
}>>;
|
|
39
|
-
|
|
40
|
-
packet: RequestPacket;
|
|
41
|
-
provider: Provider;
|
|
42
|
-
loopId: number;
|
|
43
|
-
turnId: number;
|
|
44
|
-
recordOverflow: (overflow: CurationOverflow) => Promise<void>;
|
|
45
|
-
rebuild: () => Promise<RequestPacket>;
|
|
46
|
-
}): Promise<{
|
|
47
|
-
packet: RequestPacket;
|
|
48
|
-
fit: boolean;
|
|
49
|
-
boundaryRolledBack: boolean;
|
|
50
|
-
}>;
|
|
51
|
-
rollbackNewestBoundary(loopId: number, turnId: number): Promise<void>;
|
|
39
|
+
curationOverflow(packet: RequestPacket, provider: Provider): CurationOverflow | null;
|
|
52
40
|
buildFailurePointers(loopId: number, currentTurnSeq: number): Promise<Array<{
|
|
53
41
|
status: number;
|
|
54
42
|
coordinate: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PacketBuilder.d.ts","sourceRoot":"","sources":["../../src/core/PacketBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"PacketBuilder.d.ts","sourceRoot":"","sources":["../../src/core/PacketBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAgBhD,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,mBAAmB,CAAC;AAG5E,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AA0FtE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAID,MAAM,CAAC,OAAO,OAAO,aAAa;;IAU9B,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE;QACpC,EAAE,EAAE,EAAE,CAAC;QACP,OAAO,EAAE,cAAc,CAAC;QACxB,SAAS,EAAE,MAAM,gBAAgB,GAAG,SAAS,CAAC;KACjD,EAQA;IAiCD,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI,CAEnD;IAIK,kBAAkB,CAAC,EACrB,eAAe,EAAE,YAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAY,EACpH,uBAA8B,EAC9B,gBAA8B,GACjC,EAAE;QACC,eAAe,EAAE,WAAW,EAAE,CAAC;QAE/B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;QAC5B,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAEtD,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,QAAQ,CAAC;QAInB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAG5B,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAGxC,gBAAgB,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;KAC/C,GAAG,OAAO,CAAC,aAAa,CAAC,CA2HzB;IAYK,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAuBjG;IAKD,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,GAAG,IAAI,CAInF;IAKK,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAC9E,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC,CASF;CAqFJ"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
var _a;
|
|
2
2
|
import { renderAddress, promptLoopPrefix } from "./plurnk-uri.js";
|
|
3
3
|
import { contentWeight } from "./content-weight.js";
|
|
4
|
-
import { docsExcludeSet } from "./teaching.js";
|
|
5
4
|
import { Policy } from "@plurnk/plurnk-execs";
|
|
6
5
|
import WorkspaceSettings from "./workspace-settings.js";
|
|
7
6
|
import LoopFlagsReader from "./LoopFlagsReader.js";
|
|
8
|
-
import { readPacketInject, readSystemPolicy
|
|
7
|
+
import { readPacketInject, readSystemPolicy } from "./packet-inject.js";
|
|
9
8
|
import { readFile } from "node:fs/promises";
|
|
10
9
|
import Paths from "../Paths.js";
|
|
11
10
|
import { readTeachingSource } from "./teaching-corpus.js";
|
|
@@ -14,11 +13,12 @@ import { readTeachingSource } from "./teaching-corpus.js";
|
|
|
14
13
|
// drift between wire and digest possible.
|
|
15
14
|
import PacketWire from "./packet-wire.js";
|
|
16
15
|
import LogEntryProjection from "./LogEntryProjection.js";
|
|
17
|
-
import { scopeEnvToAlias,
|
|
16
|
+
import { scopeEnvToAlias, resolveActiveRoute } from "@plurnk/plurnk-providers";
|
|
18
17
|
import ProviderInstantiate from "./ProviderInstantiate.js";
|
|
19
18
|
import BudgetReadout from "./BudgetReadout.js";
|
|
20
|
-
import ExecutableTools from "./ExecutableTools.js";
|
|
21
19
|
import LineAnchors from "../content/line-anchors.js";
|
|
20
|
+
import ToolResources from "./ToolResources.js";
|
|
21
|
+
import LogVisibility from "./LogVisibility.js";
|
|
22
22
|
const trimHorizontal = (value) => value.replace(/^[\t ]+|[\t ]+$/gu, "");
|
|
23
23
|
const tableCells = (line) => {
|
|
24
24
|
if (!line.startsWith("|") || !line.endsWith("|"))
|
|
@@ -99,8 +99,8 @@ const readRequiredPercentFrom = (env, name) => {
|
|
|
99
99
|
}
|
|
100
100
|
return percent / 100;
|
|
101
101
|
};
|
|
102
|
-
// Packet assembly (
|
|
103
|
-
//
|
|
102
|
+
// Packet assembly ({§packet-assembly}) and model-facing budget admission
|
|
103
|
+
// ({§overflow-turn}). Visibility changes stay in the ordinary FOLD owner.
|
|
104
104
|
class PacketBuilder {
|
|
105
105
|
#db;
|
|
106
106
|
#schemes;
|
|
@@ -114,7 +114,7 @@ class PacketBuilder {
|
|
|
114
114
|
this.#schemes = schemes;
|
|
115
115
|
this.#executors = executors;
|
|
116
116
|
// Retired capacity knobs fail at boot rather than silently becoming inert.
|
|
117
|
-
const bootAlias =
|
|
117
|
+
const bootAlias = resolveActiveRoute(process.env)?.alias ?? "";
|
|
118
118
|
this.#shedRetiredCapacityKnobs();
|
|
119
119
|
this.#promptProjectionFor(bootAlias);
|
|
120
120
|
}
|
|
@@ -154,9 +154,12 @@ class PacketBuilder {
|
|
|
154
154
|
// {§packet-stored-shape} — assemble the system/user request before the
|
|
155
155
|
// provider call; complete the same record with the provider response.
|
|
156
156
|
async buildRequestPacket({ initialMessages, requirements = "", workspaceId, workerId, loopId, currentTurnSeq, provider, gitStatus, notices = [], transientOpenLogEntryId = null, promptProjection = "automatic", }) {
|
|
157
|
+
// {§loop-flags-effective-read} Validate active-loop policy before any
|
|
158
|
+
// packet assembly or provider spend, independently of its presentation.
|
|
159
|
+
await LoopFlagsReader.read(this.#db, loopId);
|
|
157
160
|
const byRole = (role) => initialMessages.filter((m) => m.role === role).map((m) => m.content).join("\n\n");
|
|
158
161
|
// plurnk.md (grammar/dialects) ONLY — the definition is the hot-path grammar.
|
|
159
|
-
// The resource catalogue is its own `schemes` section
|
|
162
|
+
// The resource catalogue is its own `schemes` section ({§schemes-directory}),
|
|
160
163
|
// NOT appended here: the language teaching is scheme-agnostic, so the service advertises
|
|
161
164
|
// the installed scheme set at packet-time via SchemeRegistry.teach().
|
|
162
165
|
const system_definition = compactDefinitionTables(byRole("system"));
|
|
@@ -189,11 +192,8 @@ class PacketBuilder {
|
|
|
189
192
|
const log = await this.#buildLog(workerId, transientOpenLogEntryId);
|
|
190
193
|
const failures = await this.buildFailurePointers(loopId, currentTurnSeq);
|
|
191
194
|
const weighContent = contentWeight;
|
|
192
|
-
// {§tools-loop-affinity}: teaching and dispatch resolve the same loop flags.
|
|
193
|
-
const activeSchemes = this.#schemes.resolveForLoop(await LoopFlagsReader.read(this.#db, loopId), workspaceId);
|
|
194
|
-
const tools = this.#collectTools(workspaceId, await this.#workspaceEnabled(workspaceId), await WorkspaceSettings.questionsEnabled(this.#db, workspaceId), activeSchemes);
|
|
195
195
|
const curationBudget = this.curationBudgetFor(provider);
|
|
196
|
-
const alias = ProviderInstantiate.
|
|
196
|
+
const alias = ProviderInstantiate.configurationAliasOf(provider) ?? "";
|
|
197
197
|
const promptProjectionWeight = promptProjection === "withheld"
|
|
198
198
|
? 0
|
|
199
199
|
: curationBudget === null
|
|
@@ -204,9 +204,9 @@ class PacketBuilder {
|
|
|
204
204
|
// specified at {§packet-cache-monotone}. Budget placeholders resolve only
|
|
205
205
|
// after trusted whole-list transforms establish the packet being measured.
|
|
206
206
|
const inject = await readPacketInject(); // {§packet-inject} — per-turn; a broken configured path fails hard
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
|
|
207
|
+
const systemPolicy = await readSystemPolicy(); // XDG config AGENTS.md (or PLURNK_SERVICE_POLICY)
|
|
208
|
+
// {§turn0-agents-stunt} — the PROJECT AGENTS.md rides turn 0 as a foisted
|
|
209
|
+
// READ (LoopDocs → worker://plurnk/agents.md), not the system prompt.
|
|
210
210
|
// {§packet-git-status}/{§worker-branch-batch-return} — only the direct,
|
|
211
211
|
// currently running branch-batch child receives the transaction's
|
|
212
212
|
// commit-and-clean return condition. Ordinary Git state remains purely
|
|
@@ -222,14 +222,9 @@ class PacketBuilder {
|
|
|
222
222
|
.map((r) => ({ status: r.status, path: `worker://${r.name}` }));
|
|
223
223
|
const defaults = [
|
|
224
224
|
{ name: "definition", slot: "system", header: null, content: system_definition },
|
|
225
|
-
// Stable privileged policy leads
|
|
225
|
+
// Stable privileged policy leads capability teaching for
|
|
226
226
|
// prefix-cache locality. Empty policy sections simply disappear.
|
|
227
227
|
{ name: "system-policy", slot: "system", header: "Policy", content: systemPolicy ?? "" },
|
|
228
|
-
{ name: "project-policy", slot: "system", header: "Project Policy", content: projectPolicy ?? "" },
|
|
229
|
-
{ name: "tools", slot: "system", header: "Registered Tools", content: tools.executors },
|
|
230
|
-
...(tools.optionalOperations.length > 0
|
|
231
|
-
? [{ name: "optional-operations", slot: "system", header: "Enabled Optional Operations", content: tools.optionalOperations }]
|
|
232
|
-
: []),
|
|
233
228
|
{ name: "schemes", slot: "system", header: "Resources", content: this.#schemes.teach(workspaceId) },
|
|
234
229
|
...(inject !== null ? [{ name: "inject", slot: "system", header: "Operator Notes", content: inject }] : []),
|
|
235
230
|
// The append-mostly log leads volatile user status ({§packet-cache-monotone}).
|
|
@@ -249,7 +244,7 @@ class PacketBuilder {
|
|
|
249
244
|
{ name: "git", slot: "user", header: "Git Status", content: PacketWire.renderGit(gitStatus, branchAssignment?.branch ?? null) },
|
|
250
245
|
// Familiar token language is a deliberate final model projection;
|
|
251
246
|
// internally this is curation weight, never provider admission.
|
|
252
|
-
{ name: "budget", slot: "user", header: "Budget", content: budgetReadout },
|
|
247
|
+
{ name: "budget", slot: "user", header: "Context Token Budget", content: budgetReadout },
|
|
253
248
|
// The prompts section closes the status clump as a paths-only list;
|
|
254
249
|
// bodies arrive through first-class prompt rows.
|
|
255
250
|
{ name: "prompt", slot: "user", header: "Active User Prompts", content: prompt },
|
|
@@ -275,120 +270,50 @@ class PacketBuilder {
|
|
|
275
270
|
const renderWeight = weighContent(PacketWire.renderSlot(sections, "system")) + weighContent(PacketWire.renderSlot(sections, "user"));
|
|
276
271
|
return { weight: renderWeight, sections, attributions: [] };
|
|
277
272
|
}
|
|
278
|
-
// {§operator-config-workspace-execs} —
|
|
279
|
-
//
|
|
273
|
+
// {§operator-config-workspace-execs} — tool resources and dispatch share one
|
|
274
|
+
// workspace predicate.
|
|
280
275
|
async #workspaceEnabled(workspaceId) {
|
|
281
276
|
const { execs } = await WorkspaceSettings.read(this.#db, workspaceId);
|
|
282
277
|
if (execs === null)
|
|
283
278
|
return () => true;
|
|
284
279
|
return (tag) => Policy.isEnabled(tag, execs);
|
|
285
280
|
}
|
|
286
|
-
//
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
// {§send-300-choices} — the one-liner rides ONLY where questions are enabled (allowed +
|
|
294
|
-
// client-requested); the fuller questions.md doc injects through docEntries the same way.
|
|
295
|
-
const optionalOperations = questionsOn
|
|
296
|
-
? "```plurnk\n## SEND0 [300]\nDeploy where?;staging;production\n```"
|
|
297
|
-
: "";
|
|
298
|
-
const executors = this.#executors();
|
|
299
|
-
if (executors !== undefined) {
|
|
300
|
-
const excluded = docsExcludeSet();
|
|
301
|
-
const runtimes = executors.availableRuntimes(workspaceId);
|
|
302
|
-
// {§tools-capability-sheet} The table is keyed on the exec scheme (the op face,
|
|
303
|
-
// excludedInAsk). When inactive, say so positively: plurnk.md
|
|
304
|
-
// still teaches EXEC as language, and silent absence measurably invites confabulated runtimes.
|
|
305
|
-
const execActive = activeSchemes === undefined || activeSchemes.has("exec");
|
|
306
|
-
if (runtimes.length > 0 && !execActive) {
|
|
307
|
-
notices.push("EXEC operations are disabled for this loop — do not run commands; answer or advise directly");
|
|
308
|
-
}
|
|
309
|
-
else {
|
|
310
|
-
for (const tag of runtimes) {
|
|
311
|
-
if (excluded.has(tag))
|
|
312
|
-
continue; // {§tools-capability-sheet} — exclude drops the row and doc
|
|
313
|
-
if (!workspaceEnabled(tag))
|
|
314
|
-
continue; // {§operator-config-workspace-execs}
|
|
315
|
-
const entry = executors.entry(tag, workspaceId);
|
|
316
|
-
if (entry !== undefined) {
|
|
317
|
-
const registry = executors.toolRegistry(tag, workspaceId);
|
|
318
|
-
if (registry === null) {
|
|
319
|
-
executorTools.push({ runtime: tag, invocation: entry.invocation });
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
executorTools.push(...registry.tools.map((tool) => ({
|
|
323
|
-
runtime: tag,
|
|
324
|
-
invocation: tool.invocation,
|
|
325
|
-
exactTarget: tool.target,
|
|
326
|
-
})));
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
const parts = [...notices];
|
|
333
|
-
const directory = ExecutableTools.render(executorTools);
|
|
334
|
-
if (directory !== "")
|
|
335
|
-
parts.push(directory);
|
|
336
|
-
return { executors: parts.join("\n\n"), optionalOperations };
|
|
337
|
-
}
|
|
338
|
-
// #note12 — the plugin-provided reference docs (schemes' + execs' `documentation`),
|
|
339
|
-
// materialized at worker://plurnk/docs/<name>.md by LoopDocs (like operator
|
|
340
|
-
// docs) so the catalog can expose each doc's curation weight.
|
|
341
|
-
async docEntries(workspaceId) {
|
|
342
|
-
const out = await this.#schemes.docs(workspaceId); // scheme docs already drop PLURNK_SERVICE_DOCS_EXCLUDE names
|
|
343
|
-
// {§send-300-choices} {§teaching-corpus} — the conditional teaching: questions.md
|
|
344
|
-
// materializes ONLY for enabled workspaces — the same conditional-doc mechanism as the EXEC
|
|
345
|
-
// plugin docs below. An un-enabled workspace is never taught the op it can't use.
|
|
346
|
-
if (await WorkspaceSettings.questionsEnabled(this.#db, workspaceId)) {
|
|
347
|
-
const q = await this.#schemes.questionsDoc();
|
|
348
|
-
if (q.length > 0)
|
|
349
|
-
out.push({ name: "questions", content: q });
|
|
350
|
-
}
|
|
281
|
+
// {§schemes-self-doc-materialization} {§tools-resource-materialization} —
|
|
282
|
+
// one reserved reference set, materialized by LoopDocs.
|
|
283
|
+
async referenceEntries(workspaceId) {
|
|
284
|
+
const out = (await this.#schemes.docs(workspaceId)).map(({ name, content }) => ({
|
|
285
|
+
pathname: `/skills/plurnk/${name}.md`,
|
|
286
|
+
content,
|
|
287
|
+
}));
|
|
351
288
|
const executors = this.#executors();
|
|
352
289
|
if (executors !== undefined) {
|
|
353
|
-
const excluded = docsExcludeSet();
|
|
354
290
|
const workspaceEnabled = await this.#workspaceEnabled(workspaceId); // {§operator-config-workspace-execs}
|
|
355
291
|
for (const tag of executors.availableRuntimes(workspaceId)) {
|
|
356
|
-
if (excluded.has(tag))
|
|
357
|
-
continue; // {§tools-capability-sheet} — exec docs honor the same exclude
|
|
358
292
|
if (!workspaceEnabled(tag))
|
|
359
293
|
continue;
|
|
360
294
|
const entry = executors.entry(tag, workspaceId);
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
295
|
+
if (entry === undefined)
|
|
296
|
+
continue;
|
|
297
|
+
out.push(...ToolResources.render({
|
|
298
|
+
runtime: tag,
|
|
299
|
+
summary: entry.summary,
|
|
300
|
+
invocation: entry.invocation,
|
|
301
|
+
details: entry.details,
|
|
302
|
+
registry: executors.toolRegistry(tag, workspaceId),
|
|
303
|
+
...(entry.resourcesPath === undefined ? {} : { resourcesPath: entry.resourcesPath }),
|
|
304
|
+
}));
|
|
364
305
|
}
|
|
365
306
|
}
|
|
366
|
-
return out;
|
|
307
|
+
return out.toSorted((left, right) => left.pathname.localeCompare(right.pathname));
|
|
367
308
|
}
|
|
368
|
-
//
|
|
369
|
-
//
|
|
370
|
-
//
|
|
371
|
-
|
|
372
|
-
// rows born there plus exact older rows it transitioned folded→open — then
|
|
373
|
-
// rebuild and re-measure.
|
|
374
|
-
// {§grinder-overflow-only} — fires only on actual overflow, never speculatively
|
|
375
|
-
async enforceBudget({ packet, provider, loopId, turnId, recordOverflow, rebuild }) {
|
|
309
|
+
// {§overflow-turn-only} — a pure admission fact. TurnRunner owns the
|
|
310
|
+
// producer-neutral recovery transition; PacketBuilder never mutates log
|
|
311
|
+
// visibility while measuring a candidate request.
|
|
312
|
+
curationOverflow(packet, provider) {
|
|
376
313
|
const budget = this.curationBudgetFor(provider);
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
}
|
|
381
|
-
const weight = measure(packet);
|
|
382
|
-
await recordOverflow({ weight, budget, excess: weight - budget });
|
|
383
|
-
// ONE rule, every turn ({§grinder-layer1-rollback}): atomically fold/tag
|
|
384
|
-
// context introduced by the newest boundary. Other older history remains
|
|
385
|
-
// model-owned; remaining curation debt is neither failure nor strike.
|
|
386
|
-
await this.#db.engine_grinder_fold_newest_turn({ loop_id: loopId, turn_id: turnId });
|
|
387
|
-
const current = await rebuild();
|
|
388
|
-
return { packet: current, fit: measure(current) <= budget, boundaryRolledBack: true };
|
|
389
|
-
}
|
|
390
|
-
async rollbackNewestBoundary(loopId, turnId) {
|
|
391
|
-
await this.#db.engine_grinder_fold_newest_turn({ loop_id: loopId, turn_id: turnId });
|
|
314
|
+
if (budget === null || packet.weight <= budget)
|
|
315
|
+
return null;
|
|
316
|
+
return { weight: packet.weight, budget, excess: packet.weight - budget };
|
|
392
317
|
}
|
|
393
318
|
// Every prior-turn operation failure is durable before packet assembly.
|
|
394
319
|
// The model-facing Errors section is only a terse projection of those rows;
|
|
@@ -446,7 +371,7 @@ class PacketBuilder {
|
|
|
446
371
|
coordinate: `${r.loop_seq}/${r.turn_seq}/${r.sequence}`,
|
|
447
372
|
origin: r.origin,
|
|
448
373
|
op: r.op,
|
|
449
|
-
|
|
374
|
+
delimiter: r.delimiter,
|
|
450
375
|
signal: r.signal === null ? null : JSON.parse(r.signal),
|
|
451
376
|
target: {
|
|
452
377
|
scheme: r.scheme,
|
|
@@ -461,7 +386,9 @@ class PacketBuilder {
|
|
|
461
386
|
mimetype_rx: r.mimetype_rx,
|
|
462
387
|
tx,
|
|
463
388
|
mimetype_tx: r.mimetype_tx,
|
|
464
|
-
folded: r.
|
|
389
|
+
folded: r.id === transientOpenLogEntryId
|
|
390
|
+
? LogVisibility.OPEN
|
|
391
|
+
: LogVisibility.parse(r.folded),
|
|
465
392
|
source: r.source,
|
|
466
393
|
attrs: r.attrs === null ? null : JSON.parse(r.attrs),
|
|
467
394
|
tags: JSON.parse(r.tags),
|