@phigon/observer 8.1.0 → 8.2.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/README.md +51 -8
- package/dist/bin/guardian-runner-darwin-amd64 +0 -0
- package/dist/bin/guardian-runner-darwin-arm64 +0 -0
- package/dist/bin/guardian-runner-linux-amd64 +0 -0
- package/dist/bin/guardian-runner-linux-arm64 +0 -0
- package/dist/bin/guardian-runner-windows-amd64.exe +0 -0
- package/dist/bin/guardian-runner-windows-arm64.exe +0 -0
- package/dist/src/action-policy.d.ts.map +1 -1
- package/dist/src/action-policy.js +4 -2
- package/dist/src/action-policy.js.map +1 -1
- package/dist/src/activity/adapters/claude.d.ts.map +1 -1
- package/dist/src/activity/adapters/claude.js +19 -1
- package/dist/src/activity/adapters/claude.js.map +1 -1
- package/dist/src/activity/adapters/cline-task.d.ts +7 -0
- package/dist/src/activity/adapters/cline-task.d.ts.map +1 -0
- package/dist/src/activity/adapters/cline-task.js +197 -0
- package/dist/src/activity/adapters/cline-task.js.map +1 -0
- package/dist/src/activity/adapters/cline.d.ts +3 -0
- package/dist/src/activity/adapters/cline.d.ts.map +1 -0
- package/dist/src/activity/adapters/cline.js +102 -0
- package/dist/src/activity/adapters/cline.js.map +1 -0
- package/dist/src/activity/adapters/codex.d.ts.map +1 -1
- package/dist/src/activity/adapters/codex.js +76 -0
- package/dist/src/activity/adapters/codex.js.map +1 -1
- package/dist/src/activity/adapters/copilot-chat.d.ts +3 -0
- package/dist/src/activity/adapters/copilot-chat.d.ts.map +1 -0
- package/dist/src/activity/adapters/copilot-chat.js +176 -0
- package/dist/src/activity/adapters/copilot-chat.js.map +1 -0
- package/dist/src/activity/adapters/copilot.d.ts +2 -1
- package/dist/src/activity/adapters/copilot.d.ts.map +1 -1
- package/dist/src/activity/adapters/copilot.js +173 -2
- package/dist/src/activity/adapters/copilot.js.map +1 -1
- package/dist/src/activity/adapters/cursor.d.ts +3 -0
- package/dist/src/activity/adapters/cursor.d.ts.map +1 -0
- package/dist/src/activity/adapters/cursor.js +86 -0
- package/dist/src/activity/adapters/cursor.js.map +1 -0
- package/dist/src/activity/adapters/factory-droid.d.ts +3 -0
- package/dist/src/activity/adapters/factory-droid.d.ts.map +1 -0
- package/dist/src/activity/adapters/factory-droid.js +126 -0
- package/dist/src/activity/adapters/factory-droid.js.map +1 -0
- package/dist/src/activity/adapters/gemini.d.ts +3 -0
- package/dist/src/activity/adapters/gemini.d.ts.map +1 -0
- package/dist/src/activity/adapters/gemini.js +177 -0
- package/dist/src/activity/adapters/gemini.js.map +1 -0
- package/dist/src/activity/adapters/goose.d.ts +3 -0
- package/dist/src/activity/adapters/goose.d.ts.map +1 -0
- package/dist/src/activity/adapters/goose.js +116 -0
- package/dist/src/activity/adapters/goose.js.map +1 -0
- package/dist/src/activity/adapters/kiro.d.ts +3 -0
- package/dist/src/activity/adapters/kiro.d.ts.map +1 -0
- package/dist/src/activity/adapters/kiro.js +47 -0
- package/dist/src/activity/adapters/kiro.js.map +1 -0
- package/dist/src/activity/adapters/opencode.d.ts.map +1 -1
- package/dist/src/activity/adapters/opencode.js +108 -1
- package/dist/src/activity/adapters/opencode.js.map +1 -1
- package/dist/src/activity/adapters/zed.d.ts +3 -0
- package/dist/src/activity/adapters/zed.d.ts.map +1 -0
- package/dist/src/activity/adapters/zed.js +134 -0
- package/dist/src/activity/adapters/zed.js.map +1 -0
- package/dist/src/activity/collector.d.ts +12 -0
- package/dist/src/activity/collector.d.ts.map +1 -1
- package/dist/src/activity/collector.js +156 -3
- package/dist/src/activity/collector.js.map +1 -1
- package/dist/src/activity/goose-sqlite-source.d.ts +33 -0
- package/dist/src/activity/goose-sqlite-source.d.ts.map +1 -0
- package/dist/src/activity/goose-sqlite-source.js +274 -0
- package/dist/src/activity/goose-sqlite-source.js.map +1 -0
- package/dist/src/activity/index.d.ts +3 -0
- package/dist/src/activity/index.d.ts.map +1 -1
- package/dist/src/activity/index.js +3 -0
- package/dist/src/activity/index.js.map +1 -1
- package/dist/src/activity/ingest.d.ts.map +1 -1
- package/dist/src/activity/ingest.js +2 -1
- package/dist/src/activity/ingest.js.map +1 -1
- package/dist/src/activity/json-document-source.d.ts +136 -0
- package/dist/src/activity/json-document-source.d.ts.map +1 -0
- package/dist/src/activity/json-document-source.js +569 -0
- package/dist/src/activity/json-document-source.js.map +1 -0
- package/dist/src/activity/normalize.d.ts.map +1 -1
- package/dist/src/activity/normalize.js +64 -6
- package/dist/src/activity/normalize.js.map +1 -1
- package/dist/src/activity/opencode-message-tables.d.ts +87 -0
- package/dist/src/activity/opencode-message-tables.d.ts.map +1 -0
- package/dist/src/activity/opencode-message-tables.js +546 -0
- package/dist/src/activity/opencode-message-tables.js.map +1 -0
- package/dist/src/activity/opencode-sqlite-source.d.ts +7 -0
- package/dist/src/activity/opencode-sqlite-source.d.ts.map +1 -1
- package/dist/src/activity/opencode-sqlite-source.js +153 -63
- package/dist/src/activity/opencode-sqlite-source.js.map +1 -1
- package/dist/src/activity/source-reader.d.ts +16 -1
- package/dist/src/activity/source-reader.d.ts.map +1 -1
- package/dist/src/activity/source-reader.js +308 -29
- package/dist/src/activity/source-reader.js.map +1 -1
- package/dist/src/activity/sqlite-connections.d.ts +77 -0
- package/dist/src/activity/sqlite-connections.d.ts.map +1 -0
- package/dist/src/activity/sqlite-connections.js +220 -0
- package/dist/src/activity/sqlite-connections.js.map +1 -0
- package/dist/src/activity/zed-sqlite-source.d.ts +65 -0
- package/dist/src/activity/zed-sqlite-source.d.ts.map +1 -0
- package/dist/src/activity/zed-sqlite-source.js +547 -0
- package/dist/src/activity/zed-sqlite-source.js.map +1 -0
- package/dist/src/agent-action-executor.d.ts +13 -1
- package/dist/src/agent-action-executor.d.ts.map +1 -1
- package/dist/src/agent-action-executor.js +108 -56
- package/dist/src/agent-action-executor.js.map +1 -1
- package/dist/src/agentic-guardian.d.ts.map +1 -1
- package/dist/src/agentic-guardian.js +6 -5
- package/dist/src/agentic-guardian.js.map +1 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +47 -10
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.d.ts +13 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +99 -3
- package/dist/src/config.js.map +1 -1
- package/dist/src/connection-config.d.ts.map +1 -1
- package/dist/src/connection-config.js +5 -0
- package/dist/src/connection-config.js.map +1 -1
- package/dist/src/content-redaction.d.ts.map +1 -1
- package/dist/src/content-redaction.js +9 -2
- package/dist/src/content-redaction.js.map +1 -1
- package/dist/src/credential-store.d.ts.map +1 -1
- package/dist/src/credential-store.js +2 -1
- package/dist/src/credential-store.js.map +1 -1
- package/dist/src/custom-agent-registry.d.ts.map +1 -1
- package/dist/src/custom-agent-registry.js +2 -1
- package/dist/src/custom-agent-registry.js.map +1 -1
- package/dist/src/discovery/adapters/generic.d.ts.map +1 -1
- package/dist/src/discovery/adapters/generic.js +160 -2
- package/dist/src/discovery/adapters/generic.js.map +1 -1
- package/dist/src/discovery/engine.d.ts +7 -1
- package/dist/src/discovery/engine.d.ts.map +1 -1
- package/dist/src/discovery/engine.js +20 -5
- package/dist/src/discovery/engine.js.map +1 -1
- package/dist/src/discovery/known-agent.d.ts +7 -0
- package/dist/src/discovery/known-agent.d.ts.map +1 -1
- package/dist/src/discovery/known-agent.js +9 -4
- package/dist/src/discovery/known-agent.js.map +1 -1
- package/dist/src/discovery/system-evidence.d.ts +40 -1
- package/dist/src/discovery/system-evidence.d.ts.map +1 -1
- package/dist/src/discovery/system-evidence.js +189 -16
- package/dist/src/discovery/system-evidence.js.map +1 -1
- package/dist/src/event-queue.d.ts.map +1 -1
- package/dist/src/event-queue.js +88 -38
- package/dist/src/event-queue.js.map +1 -1
- package/dist/src/event-spool.d.ts.map +1 -1
- package/dist/src/event-spool.js +58 -10
- package/dist/src/event-spool.js.map +1 -1
- package/dist/src/guardian-containment.d.ts +2 -6
- package/dist/src/guardian-containment.d.ts.map +1 -1
- package/dist/src/guardian-containment.js +12 -63
- package/dist/src/guardian-containment.js.map +1 -1
- package/dist/src/guardian-decision-journal.d.ts.map +1 -1
- package/dist/src/guardian-decision-journal.js +2 -1
- package/dist/src/guardian-decision-journal.js.map +1 -1
- package/dist/src/guardian-managed-exec.d.ts.map +1 -1
- package/dist/src/guardian-managed-exec.js +2 -1
- package/dist/src/guardian-managed-exec.js.map +1 -1
- package/dist/src/guardian-model-bridge.d.ts.map +1 -1
- package/dist/src/guardian-model-bridge.js +2 -1
- package/dist/src/guardian-model-bridge.js.map +1 -1
- package/dist/src/guardian-native.d.ts +0 -1
- package/dist/src/guardian-native.d.ts.map +1 -1
- package/dist/src/guardian-native.js +0 -6
- package/dist/src/guardian-native.js.map +1 -1
- package/dist/src/guardian-process-monitor.d.ts +3 -0
- package/dist/src/guardian-process-monitor.d.ts.map +1 -1
- package/dist/src/guardian-process-monitor.js +8 -0
- package/dist/src/guardian-process-monitor.js.map +1 -1
- package/dist/src/historical-identity-store.d.ts.map +1 -1
- package/dist/src/historical-identity-store.js +2 -1
- package/dist/src/historical-identity-store.js.map +1 -1
- package/dist/src/installation.d.ts.map +1 -1
- package/dist/src/installation.js +3 -2
- package/dist/src/installation.js.map +1 -1
- package/dist/src/machine-command-executor.d.ts +22 -7
- package/dist/src/machine-command-executor.d.ts.map +1 -1
- package/dist/src/machine-command-executor.js +91 -17
- package/dist/src/machine-command-executor.js.map +1 -1
- package/dist/src/pair.d.ts.map +1 -1
- package/dist/src/pair.js +3 -2
- package/dist/src/pair.js.map +1 -1
- package/dist/src/private-directory.d.ts +4 -0
- package/dist/src/private-directory.d.ts.map +1 -0
- package/dist/src/private-directory.js +35 -0
- package/dist/src/private-directory.js.map +1 -0
- package/dist/src/process-tree.d.ts +73 -0
- package/dist/src/process-tree.d.ts.map +1 -0
- package/dist/src/process-tree.js +256 -0
- package/dist/src/process-tree.js.map +1 -0
- package/dist/src/server-authority.d.ts +26 -0
- package/dist/src/server-authority.d.ts.map +1 -0
- package/dist/src/server-authority.js +102 -0
- package/dist/src/server-authority.js.map +1 -0
- package/dist/src/stream-client.d.ts +3 -1
- package/dist/src/stream-client.d.ts.map +1 -1
- package/dist/src/stream-client.js +49 -11
- package/dist/src/stream-client.js.map +1 -1
- package/dist/src/stream-state.d.ts.map +1 -1
- package/dist/src/stream-state.js +2 -1
- package/dist/src/stream-state.js.map +1 -1
- package/dist/src/system-inspection.d.ts +78 -0
- package/dist/src/system-inspection.d.ts.map +1 -0
- package/dist/src/system-inspection.js +281 -0
- package/dist/src/system-inspection.js.map +1 -0
- package/dist/src/update.d.ts.map +1 -1
- package/dist/src/update.js +9 -3
- package/dist/src/update.js.map +1 -1
- package/dist/src/user-notices.d.ts +53 -0
- package/dist/src/user-notices.d.ts.map +1 -0
- package/dist/src/user-notices.js +117 -0
- package/dist/src/user-notices.js.map +1 -0
- package/package.json +1 -1
- package/dist/src/windows-process.d.ts +0 -7
- package/dist/src/windows-process.d.ts.map +0 -1
- package/dist/src/windows-process.js +0 -18
- package/dist/src/windows-process.js.map +0 -1
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { ActivityKind, AgentKind, } from "../../generated/phigon/v1/common_pb.js";
|
|
2
|
+
import { LifecyclePhase, ToolPhase, } from "../../generated/phigon/v1/telemetry_pb.js";
|
|
3
|
+
import { activityDraft, errorDraft, lifecycleDraft, toolDrafts, } from "../normalize.js";
|
|
4
|
+
import { objectValue, stringField, } from "../record.js";
|
|
5
|
+
/**
|
|
6
|
+
* Cursor agent transcripts, written by the Cursor editor's agent and the
|
|
7
|
+
* `cursor-agent` CLI to
|
|
8
|
+
* `~/.cursor/projects/<project>/agent-transcripts/<id>/<id>.jsonl`
|
|
9
|
+
* (subagents in `<id>/subagents/<sub>.jsonl`). Each line is
|
|
10
|
+
* `{ role, message: { content: [...] } }` with text blocks and tool_use
|
|
11
|
+
* blocks `{ name, input }`; tool results are not recorded. Turn markers are
|
|
12
|
+
* `{ type: "turn_ended", status, error? }` and `{ type: "error", error }`.
|
|
13
|
+
*/
|
|
14
|
+
class CursorActivityAdapter {
|
|
15
|
+
id = "cursor-transcript";
|
|
16
|
+
agentKind = AgentKind.GENERIC;
|
|
17
|
+
parse(record, context) {
|
|
18
|
+
try {
|
|
19
|
+
const line = objectValue(record);
|
|
20
|
+
if (line === null)
|
|
21
|
+
return [];
|
|
22
|
+
const type = stringField(line, "type");
|
|
23
|
+
if (type === "turn_ended") {
|
|
24
|
+
return stringField(line, "status") === "error"
|
|
25
|
+
? [errorDraft(this.agentKind, context, "turn_error")]
|
|
26
|
+
: [lifecycleDraft(this.agentKind, context, LifecyclePhase.IDLE, "Cursor turn completed.")];
|
|
27
|
+
}
|
|
28
|
+
if (type === "error") {
|
|
29
|
+
return [errorDraft(this.agentKind, context, "agent_error")];
|
|
30
|
+
}
|
|
31
|
+
const role = stringField(line, "role");
|
|
32
|
+
if (role !== "user" && role !== "assistant")
|
|
33
|
+
return [];
|
|
34
|
+
const content = objectValue(line["message"])?.["content"];
|
|
35
|
+
const blocks = Array.isArray(content) ? content : [content];
|
|
36
|
+
const drafts = [];
|
|
37
|
+
const texts = [];
|
|
38
|
+
for (const block of blocks.slice(0, 256)) {
|
|
39
|
+
if (typeof block === "string") {
|
|
40
|
+
texts.push(block);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
const item = objectValue(block);
|
|
44
|
+
if (item === null)
|
|
45
|
+
continue;
|
|
46
|
+
const blockType = stringField(item, "type");
|
|
47
|
+
if (blockType === "text") {
|
|
48
|
+
texts.push(stringField(item, "text"));
|
|
49
|
+
}
|
|
50
|
+
else if (blockType === "tool_use" && role === "assistant") {
|
|
51
|
+
const input = item["input"];
|
|
52
|
+
drafts.push(...toolDrafts(this.agentKind, context, {
|
|
53
|
+
toolName: stringField(item, "name") || "tool",
|
|
54
|
+
phase: ToolPhase.REQUESTED,
|
|
55
|
+
// ApplyPatch carries the patch text itself as its input.
|
|
56
|
+
arguments: typeof input === "string" ? { patch: input } : input,
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const joined = texts.filter((value) => value.trim() !== "").join("\n");
|
|
61
|
+
const text = role === "user" ? typedRequest(joined) : joined;
|
|
62
|
+
if (text !== "") {
|
|
63
|
+
drafts.unshift(activityDraft(this.agentKind, context, role === "user" ? ActivityKind.PROMPT : ActivityKind.RESPONSE, role === "user"
|
|
64
|
+
? "User prompt submitted."
|
|
65
|
+
: "Agent response produced.", text, role === "user" ? "promptContent" : "responseContent", `cursor_${role}`));
|
|
66
|
+
}
|
|
67
|
+
return drafts;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return [errorDraft(this.agentKind, context, "malformed_record")];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Cursor wraps what the user typed in `<user_query>` and adds the context it
|
|
76
|
+
* attached (open files, selections, a timestamp) around it. Only the typed
|
|
77
|
+
* request is the prompt; a message without the wrapper is kept whole.
|
|
78
|
+
*/
|
|
79
|
+
function typedRequest(text) {
|
|
80
|
+
const queries = [...text.matchAll(/<user_query>([\s\S]*?)<\/user_query>/gu)]
|
|
81
|
+
.map((match) => (match[1] ?? "").trim())
|
|
82
|
+
.filter((query) => query !== "");
|
|
83
|
+
return queries.length > 0 ? queries.join("\n\n") : text;
|
|
84
|
+
}
|
|
85
|
+
export const cursorActivityAdapter = new CursorActivityAdapter();
|
|
86
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../src/activity/adapters/cursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory-droid.d.ts","sourceRoot":"","sources":["../../../../src/activity/adapters/factory-droid.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAGV,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAsJrB,eAAO,MAAM,2BAA2B,EAAE,qBACP,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { ActivityKind, AgentKind, } from "../../generated/phigon/v1/common_pb.js";
|
|
2
|
+
import { LifecyclePhase, ToolPhase, } from "../../generated/phigon/v1/telemetry_pb.js";
|
|
3
|
+
import { activityDraft, errorDraft, lifecycleDraft, toolDrafts, } from "../normalize.js";
|
|
4
|
+
import { extractText, objectValue, recordObservedAt, stringField, } from "../record.js";
|
|
5
|
+
const maxTrackedToolCalls = 4_096;
|
|
6
|
+
/**
|
|
7
|
+
* Factory Droid sessions, appended to
|
|
8
|
+
* `~/.factory/sessions/<project>/<session id>.jsonl`. The first line is
|
|
9
|
+
* `{ type: "session_start", id, title, cwd }`; each message is an envelope
|
|
10
|
+
* `{ type: "message", id, timestamp?, message: { role, content } }` whose
|
|
11
|
+
* content holds Anthropic-style blocks: text, thinking, tool_use and (in
|
|
12
|
+
* user messages) tool_result. `{ type: "session_event", data:
|
|
13
|
+
* "session_ended" }` closes the session.
|
|
14
|
+
*/
|
|
15
|
+
class FactoryDroidActivityAdapter {
|
|
16
|
+
id = "factory-droid";
|
|
17
|
+
agentKind = AgentKind.GENERIC;
|
|
18
|
+
#toolNames = new Map();
|
|
19
|
+
parse(record, context) {
|
|
20
|
+
try {
|
|
21
|
+
const object = objectValue(record);
|
|
22
|
+
if (object === null)
|
|
23
|
+
return [];
|
|
24
|
+
const observedContext = {
|
|
25
|
+
...context,
|
|
26
|
+
observedAt: recordObservedAt(record, context.observedAt),
|
|
27
|
+
};
|
|
28
|
+
const type = stringField(object, "type");
|
|
29
|
+
if (type === "session_start") {
|
|
30
|
+
return [lifecycleDraft(this.agentKind, observedContext, LifecyclePhase.DISCOVERED, "Droid session started.")];
|
|
31
|
+
}
|
|
32
|
+
if (type === "session_event") {
|
|
33
|
+
return stringField(object, "data") === "session_ended"
|
|
34
|
+
? [lifecycleDraft(this.agentKind, observedContext, LifecyclePhase.STOPPED, "Droid session ended.")]
|
|
35
|
+
: [];
|
|
36
|
+
}
|
|
37
|
+
if (type !== "message")
|
|
38
|
+
return [];
|
|
39
|
+
const message = objectValue(object["message"]);
|
|
40
|
+
const role = stringField(message, "role");
|
|
41
|
+
if (role !== "user" && role !== "assistant")
|
|
42
|
+
return [];
|
|
43
|
+
const content = message?.["content"];
|
|
44
|
+
const blocks = Array.isArray(content) ? content : [content];
|
|
45
|
+
const drafts = [];
|
|
46
|
+
const texts = [];
|
|
47
|
+
for (const block of blocks.slice(0, 256)) {
|
|
48
|
+
if (typeof block === "string") {
|
|
49
|
+
texts.push(block);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const item = objectValue(block);
|
|
53
|
+
if (item === null)
|
|
54
|
+
continue;
|
|
55
|
+
const blockType = stringField(item, "type");
|
|
56
|
+
if (blockType === "text") {
|
|
57
|
+
texts.push(stringField(item, "text"));
|
|
58
|
+
}
|
|
59
|
+
else if (blockType === "thinking" && role === "assistant") {
|
|
60
|
+
const thinking = stringField(item, "thinking") || stringField(item, "text");
|
|
61
|
+
if (thinking.trim() === "")
|
|
62
|
+
continue;
|
|
63
|
+
drafts.push(activityDraft(this.agentKind, observedContext, ActivityKind.REASONING, "Agent reasoning updated.", thinking, "reasoningContent", "thinking"));
|
|
64
|
+
}
|
|
65
|
+
else if (blockType === "tool_use" && role === "assistant") {
|
|
66
|
+
drafts.push(...this.#toolUse(item, observedContext));
|
|
67
|
+
}
|
|
68
|
+
else if (blockType === "tool_result") {
|
|
69
|
+
drafts.push(...this.#toolResult(item, observedContext));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const text = (role === "user" ? texts.map(withoutReminders) : texts)
|
|
73
|
+
.filter((value) => value.trim() !== "")
|
|
74
|
+
.join("\n");
|
|
75
|
+
if (text !== "") {
|
|
76
|
+
drafts.unshift(activityDraft(this.agentKind, observedContext, role === "user" ? ActivityKind.PROMPT : ActivityKind.RESPONSE, role === "user"
|
|
77
|
+
? "User prompt submitted."
|
|
78
|
+
: "Agent response produced.", text, role === "user" ? "promptContent" : "responseContent", `droid_${role}`));
|
|
79
|
+
}
|
|
80
|
+
return drafts;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return [errorDraft(this.agentKind, context, "malformed_record")];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
#toolUse(item, context) {
|
|
87
|
+
const id = stringField(item, "id");
|
|
88
|
+
const name = stringField(item, "name") || "tool";
|
|
89
|
+
if (id !== "") {
|
|
90
|
+
this.#toolNames.set(`${context.sessionId}\u0000${id}`, name);
|
|
91
|
+
if (this.#toolNames.size > maxTrackedToolCalls) {
|
|
92
|
+
const oldest = this.#toolNames.keys().next().value;
|
|
93
|
+
if (oldest !== undefined)
|
|
94
|
+
this.#toolNames.delete(oldest);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return toolDrafts(this.agentKind, context, {
|
|
98
|
+
invocationId: id,
|
|
99
|
+
toolName: name,
|
|
100
|
+
phase: ToolPhase.REQUESTED,
|
|
101
|
+
arguments: item["input"],
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
#toolResult(item, context) {
|
|
105
|
+
const id = stringField(item, "tool_use_id");
|
|
106
|
+
const key = `${context.sessionId}\u0000${id}`;
|
|
107
|
+
const name = this.#toolNames.get(key) ?? "tool";
|
|
108
|
+
this.#toolNames.delete(key);
|
|
109
|
+
const output = extractText(item["content"]);
|
|
110
|
+
return toolDrafts(this.agentKind, context, {
|
|
111
|
+
invocationId: id,
|
|
112
|
+
toolName: name,
|
|
113
|
+
phase: item["is_error"] === true ? ToolPhase.FAILED : ToolPhase.SUCCEEDED,
|
|
114
|
+
...(output === "" ? {} : { output }),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Text the agent adds to a user turn for the model inside
|
|
120
|
+
* `<system-reminder>` tags; the user did not type it.
|
|
121
|
+
*/
|
|
122
|
+
function withoutReminders(text) {
|
|
123
|
+
return text.replace(/<system-reminder>[\s\S]*?<\/system-reminder>/gu, "").trim();
|
|
124
|
+
}
|
|
125
|
+
export const factoryDroidActivityAdapter = new FactoryDroidActivityAdapter();
|
|
126
|
+
//# sourceMappingURL=factory-droid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory-droid.js","sourceRoot":"","sources":["../../../../src/activity/adapters/factory-droid.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../../src/activity/adapters/gemini.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAGV,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAkNrB,eAAO,MAAM,qBAAqB,EAAE,qBACP,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { ActivityKind, AgentKind, } from "../../generated/phigon/v1/common_pb.js";
|
|
2
|
+
import { LifecyclePhase, ToolPhase, } from "../../generated/phigon/v1/telemetry_pb.js";
|
|
3
|
+
import { activityDraft, errorDraft, lifecycleDraft, toolDrafts, } from "../normalize.js";
|
|
4
|
+
import { arrayField, objectValue, recordObservedAt, stringField, } from "../record.js";
|
|
5
|
+
const maxTrackedMessages = 8_192;
|
|
6
|
+
/**
|
|
7
|
+
* Gemini CLI chat recordings
|
|
8
|
+
* (~/.gemini/tmp/<project>/chats/session-*.jsonl, JSONL since v0.39).
|
|
9
|
+
*
|
|
10
|
+
* The first line holds session metadata; each message line is a complete
|
|
11
|
+
* MessageRecord. The recorder appends the same message id again in full
|
|
12
|
+
* when it adds token counts or merges completed tool calls into the last
|
|
13
|
+
* model message, so emitted evidence is tracked per message id and only new
|
|
14
|
+
* text, thoughts and tool-call states are reported. `$set`, `$patch` and
|
|
15
|
+
* `$rewindTo` lines edit stored history and add no new activity.
|
|
16
|
+
*/
|
|
17
|
+
class GeminiActivityAdapter {
|
|
18
|
+
id = "gemini-cli";
|
|
19
|
+
agentKind = AgentKind.GENERIC;
|
|
20
|
+
#messages = new Map();
|
|
21
|
+
parse(record, context) {
|
|
22
|
+
try {
|
|
23
|
+
const object = objectValue(record);
|
|
24
|
+
if (object === null)
|
|
25
|
+
return [];
|
|
26
|
+
const observedContext = {
|
|
27
|
+
...context,
|
|
28
|
+
observedAt: recordObservedAt(record, context.observedAt),
|
|
29
|
+
};
|
|
30
|
+
const type = stringField(object, "type");
|
|
31
|
+
if (type === "") {
|
|
32
|
+
if (stringField(object, "sessionId") !== "" &&
|
|
33
|
+
stringField(object, "startTime") !== "" &&
|
|
34
|
+
!("messages" in object)) {
|
|
35
|
+
return [lifecycleDraft(this.agentKind, { ...context, observedAt: startTime(object, context.observedAt) }, LifecyclePhase.STARTED, "Gemini CLI session started.")];
|
|
36
|
+
}
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
const messageID = stringField(object, "id");
|
|
40
|
+
if (messageID === "")
|
|
41
|
+
return [];
|
|
42
|
+
if (type === "error") {
|
|
43
|
+
if (this.#state(context.sessionId, messageID).text)
|
|
44
|
+
return [];
|
|
45
|
+
this.#state(context.sessionId, messageID).text = true;
|
|
46
|
+
return [errorDraft(this.agentKind, observedContext, "gemini_error")];
|
|
47
|
+
}
|
|
48
|
+
if (type === "user")
|
|
49
|
+
return this.#user(object, messageID, observedContext);
|
|
50
|
+
if (type === "gemini")
|
|
51
|
+
return this.#model(object, messageID, observedContext);
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return [errorDraft(this.agentKind, context, "malformed_record")];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
#user(object, messageID, context) {
|
|
59
|
+
const state = this.#state(context.sessionId, messageID);
|
|
60
|
+
if (state.text)
|
|
61
|
+
return [];
|
|
62
|
+
// displayContent is what the user typed when the recorded content was
|
|
63
|
+
// expanded (for example with @file includes). Tool responses sent back
|
|
64
|
+
// to the model are function-response parts without text.
|
|
65
|
+
const text = partsText(object["displayContent"]) ||
|
|
66
|
+
partsText(object["content"]);
|
|
67
|
+
if (text.trim() === "")
|
|
68
|
+
return [];
|
|
69
|
+
state.text = true;
|
|
70
|
+
return [activityDraft(this.agentKind, context, ActivityKind.PROMPT, "User prompt submitted.", text, "promptContent", "user")];
|
|
71
|
+
}
|
|
72
|
+
#model(object, messageID, context) {
|
|
73
|
+
const state = this.#state(context.sessionId, messageID);
|
|
74
|
+
const drafts = [];
|
|
75
|
+
const thoughts = arrayField(object, "thoughts");
|
|
76
|
+
for (const thought of thoughts.slice(state.thoughts, 64)) {
|
|
77
|
+
const subject = stringField(thought, "subject").trim();
|
|
78
|
+
const description = stringField(thought, "description").trim();
|
|
79
|
+
const text = [subject, description].filter(Boolean).join("\n");
|
|
80
|
+
if (text === "")
|
|
81
|
+
continue;
|
|
82
|
+
drafts.push(activityDraft(this.agentKind, context, ActivityKind.REASONING, "Agent reasoning updated.", text, "reasoningContent", "gemini_thought"));
|
|
83
|
+
}
|
|
84
|
+
state.thoughts = Math.max(state.thoughts, Math.min(thoughts.length, 64));
|
|
85
|
+
const text = partsText(object["content"]);
|
|
86
|
+
if (!state.text && text.trim() !== "") {
|
|
87
|
+
state.text = true;
|
|
88
|
+
drafts.push(activityDraft(this.agentKind, context, ActivityKind.RESPONSE, "Agent response produced.", text, "responseContent", "gemini"));
|
|
89
|
+
}
|
|
90
|
+
for (const call of arrayField(object, "toolCalls").slice(0, 32)) {
|
|
91
|
+
const callID = stringField(call, "id");
|
|
92
|
+
const status = stringField(call, "status");
|
|
93
|
+
const key = callID || `${stringField(call, "name")}:${status}`;
|
|
94
|
+
if (state.tools.get(key) === status)
|
|
95
|
+
continue;
|
|
96
|
+
state.tools.set(key, status);
|
|
97
|
+
const toolCall = objectValue(call);
|
|
98
|
+
const output = functionResponseOutput(toolCall?.["result"]) ??
|
|
99
|
+
(typeof toolCall?.["resultDisplay"] === "string"
|
|
100
|
+
? toolCall["resultDisplay"]
|
|
101
|
+
: undefined);
|
|
102
|
+
drafts.push(...toolDrafts(this.agentKind, {
|
|
103
|
+
...context,
|
|
104
|
+
observedAt: recordObservedAt(call, context.observedAt),
|
|
105
|
+
}, {
|
|
106
|
+
invocationId: callID,
|
|
107
|
+
toolName: stringField(call, "name") || "tool",
|
|
108
|
+
phase: geminiToolPhase(status),
|
|
109
|
+
arguments: toolCall?.["args"],
|
|
110
|
+
...(output === undefined ? {} : { output }),
|
|
111
|
+
}));
|
|
112
|
+
}
|
|
113
|
+
return drafts;
|
|
114
|
+
}
|
|
115
|
+
#state(sessionID, messageID) {
|
|
116
|
+
const key = `${sessionID}\u0000${messageID}`;
|
|
117
|
+
let state = this.#messages.get(key);
|
|
118
|
+
if (state === undefined) {
|
|
119
|
+
state = { text: false, thoughts: 0, tools: new Map() };
|
|
120
|
+
this.#messages.set(key, state);
|
|
121
|
+
if (this.#messages.size > maxTrackedMessages) {
|
|
122
|
+
const oldest = this.#messages.keys().next().value;
|
|
123
|
+
if (oldest !== undefined)
|
|
124
|
+
this.#messages.delete(oldest);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return state;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function geminiToolPhase(status) {
|
|
131
|
+
if (status === "success")
|
|
132
|
+
return ToolPhase.SUCCEEDED;
|
|
133
|
+
if (status === "error")
|
|
134
|
+
return ToolPhase.FAILED;
|
|
135
|
+
if (status === "cancelled")
|
|
136
|
+
return ToolPhase.CANCELLED;
|
|
137
|
+
if (status === "executing")
|
|
138
|
+
return ToolPhase.RUNNING;
|
|
139
|
+
return ToolPhase.REQUESTED;
|
|
140
|
+
}
|
|
141
|
+
/** Text of a @google/genai PartListUnion: a string, a Part, or Part[]. */
|
|
142
|
+
function partsText(value, depth = 0) {
|
|
143
|
+
if (depth > 2)
|
|
144
|
+
return "";
|
|
145
|
+
if (typeof value === "string")
|
|
146
|
+
return value;
|
|
147
|
+
if (Array.isArray(value)) {
|
|
148
|
+
return value
|
|
149
|
+
.slice(0, 256)
|
|
150
|
+
.map((part) => partsText(part, depth + 1))
|
|
151
|
+
.filter((text) => text !== "")
|
|
152
|
+
.join("\n");
|
|
153
|
+
}
|
|
154
|
+
const part = objectValue(value);
|
|
155
|
+
if (part === null || part["thought"] === true)
|
|
156
|
+
return "";
|
|
157
|
+
return typeof part["text"] === "string" ? part["text"] : "";
|
|
158
|
+
}
|
|
159
|
+
function functionResponseOutput(value) {
|
|
160
|
+
const parts = Array.isArray(value) ? value : [value];
|
|
161
|
+
const outputs = [];
|
|
162
|
+
for (const part of parts.slice(0, 32)) {
|
|
163
|
+
const response = objectValue(objectValue(objectValue(part)?.["functionResponse"])?.["response"]);
|
|
164
|
+
if (response === null)
|
|
165
|
+
continue;
|
|
166
|
+
outputs.push(response["output"] ?? response["error"] ?? response);
|
|
167
|
+
}
|
|
168
|
+
if (outputs.length === 0)
|
|
169
|
+
return undefined;
|
|
170
|
+
return outputs.length === 1 ? outputs[0] : outputs;
|
|
171
|
+
}
|
|
172
|
+
function startTime(object, fallback) {
|
|
173
|
+
const parsed = new Date(stringField(object, "startTime"));
|
|
174
|
+
return Number.isNaN(parsed.getTime()) ? fallback : parsed;
|
|
175
|
+
}
|
|
176
|
+
export const geminiActivityAdapter = new GeminiActivityAdapter();
|
|
177
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../../src/activity/adapters/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goose.d.ts","sourceRoot":"","sources":["../../../../src/activity/adapters/goose.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAGV,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAoIrB,eAAO,MAAM,oBAAoB,EAAE,qBACP,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { ActivityKind, AgentKind, } from "../../generated/phigon/v1/common_pb.js";
|
|
2
|
+
import { ToolPhase } from "../../generated/phigon/v1/telemetry_pb.js";
|
|
3
|
+
import { activityDraft, errorDraft, toolDrafts, } from "../normalize.js";
|
|
4
|
+
import { arrayField, objectValue, recordObservedAt, stringField, } from "../record.js";
|
|
5
|
+
const maxTrackedToolCalls = 4_096;
|
|
6
|
+
/**
|
|
7
|
+
* Goose session messages read from its sessions database. Each record is
|
|
8
|
+
* `{ type: "goose_message", role, content, metadata }` where content holds
|
|
9
|
+
* Goose's serialized MessageContent blocks: text, thinking, toolRequest
|
|
10
|
+
* `{id, toolCall: {status, value: {name, arguments}}}` and toolResponse
|
|
11
|
+
* `{id, toolResult: {status, value: {content, isError}} | {status, error}}`.
|
|
12
|
+
*/
|
|
13
|
+
class GooseActivityAdapter {
|
|
14
|
+
id = "goose-session";
|
|
15
|
+
agentKind = AgentKind.GENERIC;
|
|
16
|
+
#toolNames = new Map();
|
|
17
|
+
parse(record, context) {
|
|
18
|
+
try {
|
|
19
|
+
const object = objectValue(record);
|
|
20
|
+
if (object === null || stringField(object, "type") !== "goose_message") {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
const role = stringField(object, "role");
|
|
24
|
+
if (role !== "user" && role !== "assistant")
|
|
25
|
+
return [];
|
|
26
|
+
const observedContext = {
|
|
27
|
+
...context,
|
|
28
|
+
observedAt: recordObservedAt(record, context.observedAt),
|
|
29
|
+
};
|
|
30
|
+
// Goose hides some messages from the user (for example context it
|
|
31
|
+
// injects for the model); they were not typed or shown as chat.
|
|
32
|
+
const userVisible = objectValue(object["metadata"])?.["userVisible"] !== false;
|
|
33
|
+
const drafts = [];
|
|
34
|
+
const texts = [];
|
|
35
|
+
for (const block of arrayField(object, "content").slice(0, 256)) {
|
|
36
|
+
const type = stringField(block, "type");
|
|
37
|
+
if (type === "text") {
|
|
38
|
+
texts.push(stringField(block, "text"));
|
|
39
|
+
}
|
|
40
|
+
else if (type === "thinking" && role === "assistant") {
|
|
41
|
+
const thinking = stringField(block, "thinking");
|
|
42
|
+
if (thinking.trim() === "")
|
|
43
|
+
continue;
|
|
44
|
+
drafts.push(activityDraft(this.agentKind, observedContext, ActivityKind.REASONING, "Agent reasoning updated.", thinking, "reasoningContent", "thinking"));
|
|
45
|
+
}
|
|
46
|
+
else if (type === "toolRequest") {
|
|
47
|
+
drafts.push(...this.#toolRequest(block, observedContext));
|
|
48
|
+
}
|
|
49
|
+
else if (type === "toolResponse") {
|
|
50
|
+
drafts.push(...this.#toolResponse(block, observedContext));
|
|
51
|
+
}
|
|
52
|
+
else if (type === "error") {
|
|
53
|
+
drafts.push(errorDraft(this.agentKind, observedContext, "goose_error"));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const text = texts.filter((value) => value.trim() !== "").join("\n");
|
|
57
|
+
if (text !== "" && userVisible) {
|
|
58
|
+
drafts.unshift(activityDraft(this.agentKind, observedContext, role === "user" ? ActivityKind.PROMPT : ActivityKind.RESPONSE, role === "user"
|
|
59
|
+
? "User prompt submitted."
|
|
60
|
+
: "Agent response produced.", text, role === "user" ? "promptContent" : "responseContent", `goose_${role}`));
|
|
61
|
+
}
|
|
62
|
+
return drafts;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return [errorDraft(this.agentKind, context, "malformed_record")];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
#toolRequest(block, context) {
|
|
69
|
+
const id = stringField(block, "id");
|
|
70
|
+
const toolCall = objectValue(objectValue(block)?.["toolCall"]);
|
|
71
|
+
if (stringField(toolCall, "status") !== "success") {
|
|
72
|
+
return [errorDraft(this.agentKind, context, "goose_tool_request_error")];
|
|
73
|
+
}
|
|
74
|
+
const call = objectValue(toolCall?.["value"]);
|
|
75
|
+
const name = stringField(call, "name") || "tool";
|
|
76
|
+
if (id !== "") {
|
|
77
|
+
this.#toolNames.set(`${context.sessionId}\u0000${id}`, name);
|
|
78
|
+
if (this.#toolNames.size > maxTrackedToolCalls) {
|
|
79
|
+
const oldest = this.#toolNames.keys().next().value;
|
|
80
|
+
if (oldest !== undefined)
|
|
81
|
+
this.#toolNames.delete(oldest);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return toolDrafts(this.agentKind, context, {
|
|
85
|
+
invocationId: id,
|
|
86
|
+
toolName: name,
|
|
87
|
+
phase: ToolPhase.REQUESTED,
|
|
88
|
+
arguments: call?.["arguments"],
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
#toolResponse(block, context) {
|
|
92
|
+
const id = stringField(block, "id");
|
|
93
|
+
const key = `${context.sessionId}\u0000${id}`;
|
|
94
|
+
const name = this.#toolNames.get(key) ?? "tool";
|
|
95
|
+
this.#toolNames.delete(key);
|
|
96
|
+
const result = objectValue(objectValue(block)?.["toolResult"]);
|
|
97
|
+
const succeeded = stringField(result, "status") === "success";
|
|
98
|
+
const value = objectValue(result?.["value"]);
|
|
99
|
+
const output = succeeded
|
|
100
|
+
? arrayField(value, "content")
|
|
101
|
+
.map((item) => stringField(item, "text"))
|
|
102
|
+
.filter((text) => text !== "")
|
|
103
|
+
.join("\n")
|
|
104
|
+
: stringField(result, "error");
|
|
105
|
+
return toolDrafts(this.agentKind, context, {
|
|
106
|
+
invocationId: id,
|
|
107
|
+
toolName: name,
|
|
108
|
+
phase: succeeded && value?.["isError"] !== true
|
|
109
|
+
? ToolPhase.SUCCEEDED
|
|
110
|
+
: ToolPhase.FAILED,
|
|
111
|
+
...(output === "" ? {} : { output }),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
export const gooseActivityAdapter = new GooseActivityAdapter();
|
|
116
|
+
//# sourceMappingURL=goose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goose.js","sourceRoot":"","sources":["../../../../src/activity/adapters/goose.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kiro.d.ts","sourceRoot":"","sources":["../../../../src/activity/adapters/kiro.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAGV,qBAAqB,EACtB,MAAM,aAAa,CAAC;AAmDrB,eAAO,MAAM,mBAAmB,EAAE,qBACP,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ActivityKind, AgentKind, } from "../../generated/phigon/v1/common_pb.js";
|
|
2
|
+
import { activityDraft, errorDraft, } from "../normalize.js";
|
|
3
|
+
import { objectValue, stringField, } from "../record.js";
|
|
4
|
+
/**
|
|
5
|
+
* Kiro chat sessions, saved per workspace as
|
|
6
|
+
* `kiro.kiroagent/workspace-sessions/<workspace>/<session id>.json` in the
|
|
7
|
+
* editor's global storage: `{ sessionId, title, history: [...] }`. Each
|
|
8
|
+
* delivered record is one history item `{ message: { id, role, content },
|
|
9
|
+
* contextItems, editorState, executionId? }`, where content is a string or
|
|
10
|
+
* text parts `{ type: "text", text }`. Agent actions are kept in separate
|
|
11
|
+
* execution files and are not read.
|
|
12
|
+
*/
|
|
13
|
+
class KiroActivityAdapter {
|
|
14
|
+
id = "kiro-session";
|
|
15
|
+
agentKind = AgentKind.GENERIC;
|
|
16
|
+
parse(record, context) {
|
|
17
|
+
try {
|
|
18
|
+
const message = objectValue(objectValue(record)?.["message"]);
|
|
19
|
+
if (message === null)
|
|
20
|
+
return [];
|
|
21
|
+
const role = stringField(message, "role");
|
|
22
|
+
if (role !== "user" && role !== "assistant")
|
|
23
|
+
return [];
|
|
24
|
+
const text = messageText(message["content"]);
|
|
25
|
+
if (text === "")
|
|
26
|
+
return [];
|
|
27
|
+
return [activityDraft(this.agentKind, context, role === "user" ? ActivityKind.PROMPT : ActivityKind.RESPONSE, role === "user" ? "User prompt submitted." : "Agent response produced.", text, role === "user" ? "promptContent" : "responseContent", `kiro_${role}`)];
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return [errorDraft(this.agentKind, context, "malformed_record")];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function messageText(content) {
|
|
35
|
+
if (typeof content === "string")
|
|
36
|
+
return content.trim();
|
|
37
|
+
if (!Array.isArray(content))
|
|
38
|
+
return "";
|
|
39
|
+
return content
|
|
40
|
+
.slice(0, 256)
|
|
41
|
+
.flatMap((part) => stringField(part, "type") === "text" ? [stringField(part, "text")] : [])
|
|
42
|
+
.filter((text) => text.trim() !== "")
|
|
43
|
+
.join("\n")
|
|
44
|
+
.trim();
|
|
45
|
+
}
|
|
46
|
+
export const kiroActivityAdapter = new KiroActivityAdapter();
|
|
47
|
+
//# sourceMappingURL=kiro.js.map
|