@parall/agent-core 1.30.0 → 1.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/bridge-workspace.js +12 -12
  2. package/dist/dispatch-adapter.d.ts +15 -8
  3. package/dist/dispatch-adapter.d.ts.map +1 -1
  4. package/dist/event-format.d.ts +1 -1
  5. package/dist/event-format.d.ts.map +1 -1
  6. package/dist/event-format.js +68 -25
  7. package/dist/gateway-base.d.ts +15 -13
  8. package/dist/gateway-base.d.ts.map +1 -1
  9. package/dist/gateway-base.js +662 -312
  10. package/dist/index.d.ts +15 -12
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +13 -11
  13. package/dist/internal/attachment-input.d.ts +3 -3
  14. package/dist/internal/attachment-input.d.ts.map +1 -1
  15. package/dist/internal/attachment-input.js +61 -58
  16. package/dist/logger.d.ts +1 -1
  17. package/dist/platform-config.d.ts +28 -2
  18. package/dist/platform-config.d.ts.map +1 -1
  19. package/dist/platform-config.js +42 -11
  20. package/dist/prompt-fragments.d.ts +1 -1
  21. package/dist/prompt-fragments.d.ts.map +1 -1
  22. package/dist/prompt-fragments.js +28 -10
  23. package/dist/provider-config.d.ts +20 -0
  24. package/dist/provider-config.d.ts.map +1 -0
  25. package/dist/provider-config.js +41 -0
  26. package/dist/routing.d.ts +5 -5
  27. package/dist/routing.js +6 -6
  28. package/dist/session-state.d.ts +16 -0
  29. package/dist/session-state.d.ts.map +1 -1
  30. package/dist/session-state.js +45 -0
  31. package/dist/skills/index.d.ts +5 -4
  32. package/dist/skills/index.d.ts.map +1 -1
  33. package/dist/skills/index.js +28 -21
  34. package/dist/skills/parall-clips.d.ts +2 -0
  35. package/dist/skills/parall-clips.d.ts.map +1 -0
  36. package/dist/skills/parall-clips.js +44 -0
  37. package/dist/telemetry.d.ts +27 -0
  38. package/dist/telemetry.d.ts.map +1 -0
  39. package/dist/telemetry.js +205 -0
  40. package/dist/types.d.ts +18 -2
  41. package/dist/types.d.ts.map +1 -1
  42. package/package.json +11 -2
  43. package/src/bridge-workspace.ts +12 -12
  44. package/src/dispatch-adapter.ts +31 -8
  45. package/src/event-format.ts +80 -30
  46. package/src/gateway-base.ts +998 -442
  47. package/src/index.ts +23 -12
  48. package/src/internal/attachment-input.ts +127 -100
  49. package/src/logger.ts +1 -1
  50. package/src/platform-config.ts +61 -16
  51. package/src/prompt-fragments.ts +28 -10
  52. package/src/provider-config.ts +51 -0
  53. package/src/routing.ts +11 -11
  54. package/src/session-state.ts +62 -0
  55. package/src/skills/index.ts +34 -23
  56. package/src/skills/parall-clips.ts +44 -0
  57. package/src/telemetry.ts +252 -0
  58. package/src/types.ts +18 -2
@@ -0,0 +1,41 @@
1
+ export function llmSource(pc) {
2
+ return effectiveLLMSourceExplicit(pc) || 'parall';
3
+ }
4
+ /**
5
+ * Returns the explicitly-configured LLM source — the llm_source value when
6
+ * set, or "custom" when BYO provider credentials are present — or "" when the
7
+ * provider_config carries no source signal at all (e.g. the empty `{}` default
8
+ * that self-hosted agents always have). The daemon supervisor uses the empty
9
+ * case to defer to the machine-level llm_source instead of letting `{}` shadow
10
+ * it as "parall". Mirrors the Go `ProviderConfig.EffectiveLLMSourceExplicit`.
11
+ */
12
+ export function effectiveLLMSourceExplicit(pc) {
13
+ if (pc?.llm_source)
14
+ return pc.llm_source;
15
+ if (pc?.openai_api_key ||
16
+ pc?.openai_base_url ||
17
+ pc?.anthropic_auth_token ||
18
+ pc?.anthropic_base_url) {
19
+ return 'custom';
20
+ }
21
+ return '';
22
+ }
23
+ export function clearAllProviderCreds(env) {
24
+ delete env.ANTHROPIC_AUTH_TOKEN;
25
+ delete env.ANTHROPIC_BASE_URL;
26
+ delete env.ANTHROPIC_API_KEY;
27
+ delete env.OPENAI_API_KEY;
28
+ delete env.OPENAI_BASE_URL;
29
+ delete env.PRLL_CLAUDE_ALLOW_API_KEY;
30
+ }
31
+ export function parseProviderConfig(env) {
32
+ const raw = env.PRLL_PROVIDER_CONFIG?.trim();
33
+ if (!raw)
34
+ return undefined;
35
+ try {
36
+ return JSON.parse(raw);
37
+ }
38
+ catch (err) {
39
+ throw new Error(`Invalid PRLL_PROVIDER_CONFIG JSON: ${String(err)}`);
40
+ }
41
+ }
package/dist/routing.d.ts CHANGED
@@ -1,14 +1,14 @@
1
- import type { DispatchState, ParallEvent } from "./types.js";
1
+ import type { DispatchState, ParallEvent } from './types.js';
2
2
  /** Where an inbound event should be routed. */
3
3
  export type TriggerDisposition = {
4
- action: "main";
4
+ action: 'main';
5
5
  } | {
6
- action: "buffer-main";
6
+ action: 'buffer-main';
7
7
  } | {
8
- action: "buffer-fork";
8
+ action: 'buffer-fork';
9
9
  forkKey: string;
10
10
  } | {
11
- action: "new-fork";
11
+ action: 'new-fork';
12
12
  };
13
13
  /** Pluggable strategy for routing triggers when main session is busy. */
14
14
  export type RoutingStrategy = (event: ParallEvent, state: DispatchState) => TriggerDisposition;
package/dist/routing.js CHANGED
@@ -8,22 +8,22 @@ const MAX_CONCURRENT_FORKS = 20;
8
8
  */
9
9
  export const defaultRoutingStrategy = (event, state) => {
10
10
  if (state.mainCurrentTargetId === event.targetId) {
11
- return { action: "buffer-main" };
11
+ return { action: 'buffer-main' };
12
12
  }
13
13
  const existingForkKey = state.activeForks.get(event.targetId);
14
14
  if (existingForkKey)
15
- return { action: "buffer-fork", forkKey: existingForkKey };
15
+ return { action: 'buffer-fork', forkKey: existingForkKey };
16
16
  if (state.activeForks.size >= MAX_CONCURRENT_FORKS) {
17
- return { action: "buffer-main" };
17
+ return { action: 'buffer-main' };
18
18
  }
19
- return { action: "new-fork" };
19
+ return { action: 'new-fork' };
20
20
  };
21
21
  /** Route an inbound event based on current dispatch state. */
22
22
  export function routeTrigger(event, state, strategy = defaultRoutingStrategy) {
23
23
  const existingForkKey = state.activeForks.get(event.targetId);
24
24
  if (existingForkKey)
25
- return { action: "buffer-fork", forkKey: existingForkKey };
25
+ return { action: 'buffer-fork', forkKey: existingForkKey };
26
26
  if (!state.mainDispatching)
27
- return { action: "main" };
27
+ return { action: 'main' };
28
28
  return strategy(event, state);
29
29
  }
@@ -14,4 +14,20 @@ export declare function clearDispatchGroupKey(sessionKey: string): void;
14
14
  export declare function setDispatchNoReply(sessionKey: string, noReply: boolean): void;
15
15
  export declare function getDispatchNoReply(sessionKey: string): boolean;
16
16
  export declare function clearDispatchNoReply(sessionKey: string): void;
17
+ export type DispatchMetrics = {
18
+ deliver_text_chunks: number;
19
+ deliver_text_chars: number;
20
+ message_send_attempts: number;
21
+ message_send_successes: number;
22
+ no_reply_called: boolean;
23
+ tool_call_count: number;
24
+ started_at: number;
25
+ };
26
+ export declare function resetDispatchMetrics(sessionKey: string): void;
27
+ export declare function getDispatchMetrics(sessionKey: string): DispatchMetrics | undefined;
28
+ export declare function clearDispatchMetrics(sessionKey: string): void;
29
+ export declare function recordDeliverText(sessionKey: string, charCount: number): void;
30
+ export declare function recordMessageSend(sessionKey: string, success: boolean): void;
31
+ export declare function recordNoReply(sessionKey: string): void;
32
+ export declare function recordToolCall(sessionKey: string): void;
17
33
  //# sourceMappingURL=session-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../src/session-state.ts"],"names":[],"mappings":"AAYA,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAElE;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEvE;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAExE;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,QAEvD;AAED,2FAA2F;AAC3F,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAEzE;AAED,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE3E;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,QAExD;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAEvE;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,QAEvD;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,QAEtE;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,QAEtD"}
1
+ {"version":3,"file":"session-state.d.ts","sourceRoot":"","sources":["../src/session-state.ts"],"names":[],"mappings":"AAYA,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAElE;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEvE;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAExE;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,QAEvD;AAED,2FAA2F;AAC3F,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAEzE;AAED,4FAA4F;AAC5F,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE3E;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,QAExD;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAEvE;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,QAEvD;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,QAEtE;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,QAEtD;AAMD,MAAM,MAAM,eAAe,GAAG;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAU7D;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAElF;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAE7D;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAK7E;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAK5E;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAItD;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAIvD"}
@@ -52,3 +52,48 @@ export function getDispatchNoReply(sessionKey) {
52
52
  export function clearDispatchNoReply(sessionKey) {
53
53
  dispatchNoReplyMap.delete(normalizeSessionKey(sessionKey));
54
54
  }
55
+ const dispatchMetricsMap = new Map();
56
+ export function resetDispatchMetrics(sessionKey) {
57
+ dispatchMetricsMap.set(normalizeSessionKey(sessionKey), {
58
+ deliver_text_chunks: 0,
59
+ deliver_text_chars: 0,
60
+ message_send_attempts: 0,
61
+ message_send_successes: 0,
62
+ no_reply_called: false,
63
+ tool_call_count: 0,
64
+ started_at: Date.now(),
65
+ });
66
+ }
67
+ export function getDispatchMetrics(sessionKey) {
68
+ return dispatchMetricsMap.get(normalizeSessionKey(sessionKey));
69
+ }
70
+ export function clearDispatchMetrics(sessionKey) {
71
+ dispatchMetricsMap.delete(normalizeSessionKey(sessionKey));
72
+ }
73
+ export function recordDeliverText(sessionKey, charCount) {
74
+ const m = dispatchMetricsMap.get(normalizeSessionKey(sessionKey));
75
+ if (!m)
76
+ return;
77
+ m.deliver_text_chunks++;
78
+ m.deliver_text_chars += charCount;
79
+ }
80
+ export function recordMessageSend(sessionKey, success) {
81
+ const m = dispatchMetricsMap.get(normalizeSessionKey(sessionKey));
82
+ if (!m)
83
+ return;
84
+ m.message_send_attempts++;
85
+ if (success)
86
+ m.message_send_successes++;
87
+ }
88
+ export function recordNoReply(sessionKey) {
89
+ const m = dispatchMetricsMap.get(normalizeSessionKey(sessionKey));
90
+ if (!m)
91
+ return;
92
+ m.no_reply_called = true;
93
+ }
94
+ export function recordToolCall(sessionKey) {
95
+ const m = dispatchMetricsMap.get(normalizeSessionKey(sessionKey));
96
+ if (!m)
97
+ return;
98
+ m.tool_call_count++;
99
+ }
@@ -1,7 +1,8 @@
1
- export { PARALL_PLATFORM_SKILL } from "./parall-platform.js";
2
- export { PARALL_TASKS_SKILL } from "./parall-tasks.js";
3
- export { PARALL_WIKI_SKILL } from "./parall-wiki.js";
4
- export { PARALL_SCHEDULES_SKILL } from "./parall-schedules.js";
1
+ export { PARALL_PLATFORM_SKILL } from './parall-platform.js';
2
+ export { PARALL_TASKS_SKILL } from './parall-tasks.js';
3
+ export { PARALL_WIKI_SKILL } from './parall-wiki.js';
4
+ export { PARALL_SCHEDULES_SKILL } from './parall-schedules.js';
5
+ export { PARALL_CLIPS_SKILL } from './parall-clips.js';
5
6
  export type SkillMeta = {
6
7
  name: string;
7
8
  description: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAO/D,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,eAAO,MAAM,MAAM,EAAE,SAAS,EAqB7B,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAKvD;AAGD,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAIjE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAQvD,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,eAAO,MAAM,MAAM,EAAE,SAAS,EA+B7B,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAKvD;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAIjE"}
@@ -1,44 +1,51 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- export { PARALL_PLATFORM_SKILL } from "./parall-platform.js";
4
- export { PARALL_TASKS_SKILL } from "./parall-tasks.js";
5
- export { PARALL_WIKI_SKILL } from "./parall-wiki.js";
6
- export { PARALL_SCHEDULES_SKILL } from "./parall-schedules.js";
7
- import { PARALL_PLATFORM_SKILL } from "./parall-platform.js";
8
- import { PARALL_TASKS_SKILL } from "./parall-tasks.js";
9
- import { PARALL_WIKI_SKILL } from "./parall-wiki.js";
10
- import { PARALL_SCHEDULES_SKILL } from "./parall-schedules.js";
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ export { PARALL_PLATFORM_SKILL } from './parall-platform.js';
4
+ export { PARALL_TASKS_SKILL } from './parall-tasks.js';
5
+ export { PARALL_WIKI_SKILL } from './parall-wiki.js';
6
+ export { PARALL_SCHEDULES_SKILL } from './parall-schedules.js';
7
+ export { PARALL_CLIPS_SKILL } from './parall-clips.js';
8
+ import { PARALL_PLATFORM_SKILL } from './parall-platform.js';
9
+ import { PARALL_TASKS_SKILL } from './parall-tasks.js';
10
+ import { PARALL_WIKI_SKILL } from './parall-wiki.js';
11
+ import { PARALL_SCHEDULES_SKILL } from './parall-schedules.js';
12
+ import { PARALL_CLIPS_SKILL } from './parall-clips.js';
11
13
  export const SKILLS = [
12
14
  {
13
- name: "parall-platform",
15
+ name: 'parall-platform',
14
16
  description: "Parall platform queries and lightweight agent provisioning: list org members, agents, chats, read message history, check identity, or create another agent. Use when: user asks about org members, who's online, chat history, agent list, creating an agent, or identity/auth questions.",
15
17
  content: PARALL_PLATFORM_SKILL,
16
18
  },
17
19
  {
18
- name: "parall-tasks",
19
- description: "Parall task operations: create, update, comment on, and query tasks and projects. Use when: user asks to create a task, update task status, add comments, list tasks, or manage projects.",
20
+ name: 'parall-tasks',
21
+ description: 'Parall task operations: create, update, comment on, and query tasks and projects. Use when: user asks to create a task, update task status, add comments, list tasks, or manage projects.',
20
22
  content: PARALL_TASKS_SKILL,
21
23
  },
22
24
  {
23
- name: "parall-wiki",
24
- description: "Parall wiki operations: read, search, edit, and propose changes to organization knowledge bases. Use when: user asks to read/write docs, edit wiki pages, search knowledge base, propose changes, or review changesets.",
25
+ name: 'parall-wiki',
26
+ description: 'Parall wiki operations: read, search, edit, and propose changes to organization knowledge bases. Use when: user asks to read/write docs, edit wiki pages, search knowledge base, propose changes, or review changesets.',
25
27
  content: PARALL_WIKI_SKILL,
26
28
  },
27
29
  {
28
- name: "parall-schedules",
29
- description: "Parall schedule operations: create / pause / resume / cancel recurring or one-shot time triggers; respond to schedule fire events. Use when: user asks to set up a recurring reminder, schedule a delayed prompt, run cron-like work, or when the agent receives an `[Event: schedule.fired]` dispatch.",
30
+ name: 'parall-schedules',
31
+ description: 'Parall schedule operations: create / pause / resume / cancel recurring or one-shot time triggers; respond to schedule fire events. Use when: user asks to set up a recurring reminder, schedule a delayed prompt, run cron-like work, or when the agent receives an `[Event: schedule.fired]` dispatch.',
30
32
  content: PARALL_SCHEDULES_SKILL,
31
33
  },
34
+ {
35
+ name: 'parall-clips',
36
+ description: 'Parall clip operations: list installed clips, invoke clip commands, inspect clip details. Use when: the task requires external capabilities (GitHub, web search, etc.), user asks about available tools/clips, or you need to call a clip command.',
37
+ content: PARALL_CLIPS_SKILL,
38
+ },
32
39
  ];
33
40
  /** Write plain skill markdown files to a target directory (CC/Codex). */
34
41
  export function writeSkillFiles(targetDir) {
35
42
  fs.mkdirSync(targetDir, { recursive: true });
36
43
  for (const skill of SKILLS) {
37
- fs.writeFileSync(path.join(targetDir, `${skill.name}.md`), skill.content, "utf8");
44
+ fs.writeFileSync(path.join(targetDir, `${skill.name}.md`), skill.content, 'utf8');
38
45
  }
39
46
  }
40
47
  export function buildSkillReferences(workspaceDir) {
41
- const dir = path.join(workspaceDir, ".parall", "skills");
42
- const lines = SKILLS.map((s) => `- ${s.description.split(":")[0]}: \`${dir}/${s.name}.md\``);
43
- return `## Platform Skills (read on demand)\n\n${lines.join("\n")}\n`;
48
+ const dir = path.join(workspaceDir, '.parall', 'skills');
49
+ const lines = SKILLS.map((s) => `- ${s.description.split(':')[0]}: \`${dir}/${s.name}.md\``);
50
+ return `## Platform Skills (read on demand)\n\n${lines.join('\n')}\n`;
44
51
  }
@@ -0,0 +1,2 @@
1
+ export declare const PARALL_CLIPS_SKILL = "# Parall Clips\n\nClips are capability extensions \u2014 packaged toolkits that give you extra commands (e.g. GitHub operations, web search, code analysis). Clips installed in the org are available for any agent to invoke via the CLI.\n\n## Discovering available clips\n\n```bash\n# List all clips installed in the org\nparall clip list\n\n# Show detailed info about a clip (manifest, commands, version)\nparall clip info <alias>\n```\n\n## Invoking a clip command\n\n```bash\n# Invoke a command on a clip by alias\nparall clip invoke <alias> <command> [input]\n\n# input is optional \u2014 when provided, it can be a JSON string or plain text\nparall clip invoke github-tools list-repos '{\"org\": \"acme\"}'\nparall clip invoke web-search search \"latest Node.js LTS version\"\n\n# Custom timeout (default 30s)\nparall clip invoke github-tools create-issue '{\"title\": \"Bug report\"}' --timeout 60000\n```\n\n## How clips work\n\n1. An org admin installs a clip from the Pinix registry or creates a custom one\n2. `parall clip list` shows every clip installed in the org\n3. You can only **invoke** clips that an admin has **bound to you** \u2014 invoking an unbound clip returns a \"not bound\" error. Ask an admin to bind the clip if you need it.\n4. Each clip exposes one or more named commands with typed input/output\n\n## When to use clips\n\n- Check `parall clip list` when a task requires capabilities beyond your built-in tools (e.g. GitHub API, external services, specialized analysis)\n- Use `parall clip info <alias>` to discover available commands and their expected input format\n- If `parall clip invoke` reports the clip isn't bound to you, that clip exists in the org but hasn't been granted to you \u2014 ask an admin to bind it\n- Clip invocations return JSON output on success or an error message on failure\n\nCLI command results are JSON on stdout.\n";
2
+ //# sourceMappingURL=parall-clips.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parall-clips.d.ts","sourceRoot":"","sources":["../../src/skills/parall-clips.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,y1DA2C9B,CAAC"}
@@ -0,0 +1,44 @@
1
+ export const PARALL_CLIPS_SKILL = `# Parall Clips
2
+
3
+ Clips are capability extensions — packaged toolkits that give you extra commands (e.g. GitHub operations, web search, code analysis). Clips installed in the org are available for any agent to invoke via the CLI.
4
+
5
+ ## Discovering available clips
6
+
7
+ \`\`\`bash
8
+ # List all clips installed in the org
9
+ parall clip list
10
+
11
+ # Show detailed info about a clip (manifest, commands, version)
12
+ parall clip info <alias>
13
+ \`\`\`
14
+
15
+ ## Invoking a clip command
16
+
17
+ \`\`\`bash
18
+ # Invoke a command on a clip by alias
19
+ parall clip invoke <alias> <command> [input]
20
+
21
+ # input is optional — when provided, it can be a JSON string or plain text
22
+ parall clip invoke github-tools list-repos '{"org": "acme"}'
23
+ parall clip invoke web-search search "latest Node.js LTS version"
24
+
25
+ # Custom timeout (default 30s)
26
+ parall clip invoke github-tools create-issue '{"title": "Bug report"}' --timeout 60000
27
+ \`\`\`
28
+
29
+ ## How clips work
30
+
31
+ 1. An org admin installs a clip from the Pinix registry or creates a custom one
32
+ 2. \`parall clip list\` shows every clip installed in the org
33
+ 3. You can only **invoke** clips that an admin has **bound to you** — invoking an unbound clip returns a "not bound" error. Ask an admin to bind the clip if you need it.
34
+ 4. Each clip exposes one or more named commands with typed input/output
35
+
36
+ ## When to use clips
37
+
38
+ - Check \`parall clip list\` when a task requires capabilities beyond your built-in tools (e.g. GitHub API, external services, specialized analysis)
39
+ - Use \`parall clip info <alias>\` to discover available commands and their expected input format
40
+ - If \`parall clip invoke\` reports the clip isn't bound to you, that clip exists in the org but hasn't been granted to you — ask an admin to bind it
41
+ - Clip invocations return JSON output on success or an error message on failure
42
+
43
+ CLI command results are JSON on stdout.
44
+ `;
@@ -0,0 +1,27 @@
1
+ import { type Span } from '@opentelemetry/api';
2
+ import type { GatewayLogger } from './dispatch-adapter.js';
3
+ import type { DispatchMetrics } from './session-state.js';
4
+ import type { ParallEvent } from './types.js';
5
+ export interface TelemetryHandle {
6
+ shutdown: () => Promise<void>;
7
+ }
8
+ /**
9
+ * Initialize agent telemetry. All agents export OTLP to the Parall
10
+ * telemetry-service (`PRLL_API_URL/otel`), authenticated with `PRLL_API_KEY`.
11
+ * The service canonicalizes identity from the token and proxies to SigNoz.
12
+ *
13
+ * Resource attributes include machine/agent/org identity from env.
14
+ * Returns a no-op handle when `PRLL_API_URL` is absent (local dev).
15
+ */
16
+ export declare function initAgentTelemetry(serviceName: string, runtimeType: string): Promise<TelemetryHandle>;
17
+ export declare function startDispatchSpan(event: ParallEvent, runtimeType: string, sessionKey: string): Span | null;
18
+ export declare function endDispatchSpan(span: Span | null, metricsSnapshot: DispatchMetrics | undefined, error?: unknown): void;
19
+ export declare function recordDispatchMetric(event: ParallEvent, runtimeType: string, durationMs: number): void;
20
+ export declare function recordMissingReply(runtimeType: string): void;
21
+ export declare function runWithSessionKey<T>(sessionKey: string, fn: () => T): T;
22
+ /**
23
+ * Create a GatewayLogger that forwards all levels to OTLP logs.
24
+ * Two layers: "agent" (runtime) and "daemon".
25
+ */
26
+ export declare function createOtelLogger(layer: 'agent' | 'daemon', prefix: string): GatewayLogger;
27
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,IAAI,EAKV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAkB9C,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,CAAC,CAgG1B;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,IAAI,GAAG,IAAI,CAYb;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,GAAG,IAAI,EACjB,eAAe,EAAE,eAAe,GAAG,SAAS,EAC5C,KAAK,CAAC,EAAE,OAAO,GACd,IAAI,CAkBN;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,IAAI,CASN;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAG5D;AAID,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEvE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAmCzF"}
@@ -0,0 +1,205 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import { trace, metrics, SpanStatusCode, } from '@opentelemetry/api';
3
+ import { SeverityNumber } from '@opentelemetry/api-logs';
4
+ let initialized = false;
5
+ let shutdownFn = null;
6
+ let tracer = null;
7
+ let dispatchCounter = null;
8
+ let dispatchDuration = null;
9
+ let missingReplyCounter = null;
10
+ let otelLogger = null;
11
+ function resolveTargetType(targetId) {
12
+ if (targetId.startsWith('cht_'))
13
+ return 'chat';
14
+ if (targetId.startsWith('tsk_'))
15
+ return 'task';
16
+ if (targetId.startsWith('sch_'))
17
+ return 'schedule';
18
+ return 'unknown';
19
+ }
20
+ /**
21
+ * Initialize agent telemetry. All agents export OTLP to the Parall
22
+ * telemetry-service (`PRLL_API_URL/otel`), authenticated with `PRLL_API_KEY`.
23
+ * The service canonicalizes identity from the token and proxies to SigNoz.
24
+ *
25
+ * Resource attributes include machine/agent/org identity from env.
26
+ * Returns a no-op handle when `PRLL_API_URL` is absent (local dev).
27
+ */
28
+ export async function initAgentTelemetry(serviceName, runtimeType) {
29
+ const noopHandle = { shutdown: async () => { } };
30
+ const apiUrl = process.env.PRLL_API_URL;
31
+ const apiKey = process.env.PRLL_API_KEY;
32
+ if (!apiUrl || !apiKey) {
33
+ return noopHandle;
34
+ }
35
+ try {
36
+ const otelEndpoint = apiUrl.replace(/\/$/, '') + '/otel';
37
+ const { OTLPTraceExporter } = await import('@opentelemetry/exporter-trace-otlp-proto');
38
+ const { OTLPMetricExporter } = await import('@opentelemetry/exporter-metrics-otlp-proto');
39
+ const { OTLPLogExporter } = await import('@opentelemetry/exporter-logs-otlp-proto');
40
+ const { NodeTracerProvider, BatchSpanProcessor } = await import('@opentelemetry/sdk-trace-node');
41
+ const { MeterProvider, PeriodicExportingMetricReader } = await import('@opentelemetry/sdk-metrics');
42
+ const { LoggerProvider, BatchLogRecordProcessor } = await import('@opentelemetry/sdk-logs');
43
+ const { Resource } = await import('@opentelemetry/resources');
44
+ const resource = new Resource({
45
+ 'service.name': serviceName,
46
+ 'service.version': process.env.npm_package_version || 'unknown',
47
+ 'deployment.environment.name': process.env.PRLL_SERVER_ENV || process.env.NODE_ENV || 'development',
48
+ 'parall.runtime_type': runtimeType,
49
+ 'parall.agent_id': process.env.PRLL_AGENT_ID || '',
50
+ 'parall.machine_id': process.env.PRLL_MACHINE_ID || '',
51
+ 'parall.org_id': process.env.PRLL_ORG_ID || '',
52
+ 'parall.daemon_mode': process.env.PRLL_DAEMON_MODE === '1',
53
+ });
54
+ const authHeaders = { Authorization: `Bearer ${apiKey}` };
55
+ const traceExporter = new OTLPTraceExporter({
56
+ url: `${otelEndpoint}/v1/traces`,
57
+ headers: authHeaders,
58
+ });
59
+ const tracerProvider = new NodeTracerProvider({ resource });
60
+ tracerProvider.addSpanProcessor(new BatchSpanProcessor(traceExporter));
61
+ tracerProvider.register();
62
+ const metricExporter = new OTLPMetricExporter({
63
+ url: `${otelEndpoint}/v1/metrics`,
64
+ headers: authHeaders,
65
+ });
66
+ const metricReader = new PeriodicExportingMetricReader({
67
+ exporter: metricExporter,
68
+ exportIntervalMillis: 15_000,
69
+ });
70
+ const meterProvider = new MeterProvider({ resource, readers: [metricReader] });
71
+ metrics.setGlobalMeterProvider(meterProvider);
72
+ const logExporter = new OTLPLogExporter({
73
+ url: `${otelEndpoint}/v1/logs`,
74
+ headers: authHeaders,
75
+ });
76
+ const loggerProvider = new LoggerProvider({ resource });
77
+ loggerProvider.addLogRecordProcessor(new BatchLogRecordProcessor(logExporter));
78
+ const meter = metrics.getMeter('parall.agent');
79
+ tracer = trace.getTracer('parall.agent');
80
+ otelLogger = loggerProvider.getLogger('parall.agent');
81
+ dispatchCounter = meter.createCounter('parall.dispatch.count', {
82
+ description: 'Number of dispatch cycles completed',
83
+ });
84
+ dispatchDuration = meter.createHistogram('parall.dispatch.duration', {
85
+ description: 'Dispatch cycle duration in milliseconds',
86
+ unit: 'ms',
87
+ });
88
+ missingReplyCounter = meter.createCounter('parall.dispatch.missing_reply', {
89
+ description: 'Dispatches where agent produced text but sent no reply message',
90
+ });
91
+ initialized = true;
92
+ shutdownFn = async () => {
93
+ await tracerProvider.forceFlush();
94
+ await meterProvider.forceFlush();
95
+ await loggerProvider.forceFlush();
96
+ await tracerProvider.shutdown();
97
+ await meterProvider.shutdown();
98
+ await loggerProvider.shutdown();
99
+ };
100
+ return {
101
+ shutdown: async () => {
102
+ if (shutdownFn)
103
+ await shutdownFn();
104
+ },
105
+ };
106
+ }
107
+ catch {
108
+ return noopHandle;
109
+ }
110
+ }
111
+ export function startDispatchSpan(event, runtimeType, sessionKey) {
112
+ if (!initialized || !tracer)
113
+ return null;
114
+ return tracer.startSpan('parall.dispatch', {
115
+ attributes: {
116
+ 'dispatch.target_type': resolveTargetType(event.targetId),
117
+ 'dispatch.event_type': event.type,
118
+ 'dispatch.runtime_type': runtimeType,
119
+ 'dispatch.session_key': sessionKey,
120
+ 'dispatch.message_id': event.messageId,
121
+ 'dispatch.target_id': event.targetId,
122
+ },
123
+ });
124
+ }
125
+ export function endDispatchSpan(span, metricsSnapshot, error) {
126
+ if (!span)
127
+ return;
128
+ if (metricsSnapshot) {
129
+ span.setAttributes({
130
+ 'dispatch.deliver_text_chunks': metricsSnapshot.deliver_text_chunks,
131
+ 'dispatch.deliver_text_chars': metricsSnapshot.deliver_text_chars,
132
+ 'dispatch.message_send_attempts': metricsSnapshot.message_send_attempts,
133
+ 'dispatch.message_send_successes': metricsSnapshot.message_send_successes,
134
+ 'dispatch.no_reply_called': metricsSnapshot.no_reply_called,
135
+ 'dispatch.tool_call_count': metricsSnapshot.tool_call_count,
136
+ 'dispatch.duration_ms': Date.now() - metricsSnapshot.started_at,
137
+ });
138
+ }
139
+ if (error) {
140
+ span.setStatus({ code: SpanStatusCode.ERROR, message: String(error) });
141
+ span.recordException(error instanceof Error ? error : new Error(String(error)));
142
+ }
143
+ span.end();
144
+ }
145
+ export function recordDispatchMetric(event, runtimeType, durationMs) {
146
+ if (!initialized)
147
+ return;
148
+ const attrs = {
149
+ target_type: resolveTargetType(event.targetId),
150
+ event_type: event.type,
151
+ runtime_type: runtimeType,
152
+ };
153
+ dispatchCounter?.add(1, attrs);
154
+ dispatchDuration?.record(durationMs, attrs);
155
+ }
156
+ export function recordMissingReply(runtimeType) {
157
+ if (!initialized)
158
+ return;
159
+ missingReplyCounter?.add(1, { runtime_type: runtimeType });
160
+ }
161
+ const sessionKeyStorage = new AsyncLocalStorage();
162
+ export function runWithSessionKey(sessionKey, fn) {
163
+ return sessionKeyStorage.run(sessionKey, fn);
164
+ }
165
+ /**
166
+ * Create a GatewayLogger that forwards all levels to OTLP logs.
167
+ * Two layers: "agent" (runtime) and "daemon".
168
+ */
169
+ export function createOtelLogger(layer, prefix) {
170
+ const ts = () => new Date().toISOString();
171
+ const emit = (severity, msg) => {
172
+ if (!otelLogger)
173
+ return;
174
+ const severityNumber = severity === 'ERROR'
175
+ ? SeverityNumber.ERROR
176
+ : severity === 'WARN'
177
+ ? SeverityNumber.WARN
178
+ : SeverityNumber.INFO;
179
+ const attrs = { 'log.layer': layer, 'log.prefix': prefix };
180
+ const sk = sessionKeyStorage.getStore();
181
+ if (sk)
182
+ attrs['session.key'] = sk;
183
+ otelLogger.emit({
184
+ severityNumber,
185
+ severityText: severity,
186
+ body: msg,
187
+ attributes: attrs,
188
+ });
189
+ };
190
+ return {
191
+ info: (msg) => {
192
+ console.log(`${ts()} [${prefix}] ${msg}`);
193
+ emit('INFO', msg);
194
+ },
195
+ warn: (msg) => {
196
+ console.warn(`${ts()} [${prefix}] ${msg}`);
197
+ emit('WARN', msg);
198
+ },
199
+ error: (msg) => {
200
+ console.error(`${ts()} [${prefix}] ${msg}`);
201
+ emit('ERROR', msg);
202
+ },
203
+ child: (sub) => createOtelLogger(layer, `${prefix}:${sub}`),
204
+ };
205
+ }
package/dist/types.d.ts CHANGED
@@ -26,10 +26,17 @@ export type DispatchState = {
26
26
  };
27
27
  /** Normalized inbound event from Parall. */
28
28
  export type ParallEvent = {
29
- type: "message" | "task" | "task_comment" | "schedule" | "approval";
29
+ type: 'message' | 'task' | 'task_comment' | 'wiki_comment' | 'schedule' | 'approval';
30
30
  targetId: string;
31
31
  targetName?: string;
32
32
  targetType?: string;
33
+ /**
34
+ * Full `prll://` target URI to reply on, used for wiki_comment events where
35
+ * the reply goes back to the same wiki page / changeset via
36
+ * `parall comments add --target <uri>`. Carried separately from `targetId`
37
+ * (a bare entity id) because the reply needs the full URI incl. path/anchor.
38
+ */
39
+ replyTargetUri?: string;
33
40
  deliveryReason?: string;
34
41
  senderId: string;
35
42
  senderName: string;
@@ -50,7 +57,16 @@ export type ParallEvent = {
50
57
  /** Original event timestamp (e.g., message.created_at). When present,
51
58
  * input steps use this instead of server insertion time for ordering. */
52
59
  sentAt?: string;
53
- ackSourceType?: "message" | "task_activity" | "comment" | "schedule_run";
60
+ ackSourceType?: 'message' | 'task_activity' | 'comment' | 'schedule_run';
54
61
  ackSourceId?: string;
62
+ /** Unread message count in the target chat since agent's last interaction. */
63
+ unreadCount?: number;
64
+ /** Channel cursor: the last message ID the agent read. */
65
+ unreadSince?: string;
66
+ /** For thread replies: total replies and unread replies in the thread. */
67
+ threadReplyCount?: number;
68
+ threadUnreadCount?: number;
69
+ /** Thread cursor: the last reply ID the agent read in this thread. */
70
+ threadUnreadSince?: string;
55
71
  };
56
72
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,MAAM,MAAM,UAAU,GAAG;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,mFAAmF;IACnF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,MAAM,aAAa,GAAG;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,kBAAkB,EAAE,UAAU,EAAE,CAAC;IACjC,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,oFAAoF;IACpF,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,4CAA4C;AAC5C,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,cAAc,GAAG,UAAU,GAAG,UAAU,CAAC;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;8EAC0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,SAAS,GAAG,eAAe,GAAG,SAAS,GAAG,cAAc,CAAC;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,MAAM,MAAM,UAAU,GAAG;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,mFAAmF;IACnF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sFAAsF;IACtF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,2DAA2D;AAC3D,MAAM,MAAM,aAAa,GAAG;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,kBAAkB,EAAE,UAAU,EAAE,CAAC;IACjC,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,oFAAoF;IACpF,0BAA0B,CAAC,EAAE,MAAM,CAAC;CACrC,CAAC;AAEF,4CAA4C;AAC5C,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,cAAc,GAAG,cAAc,GAAG,UAAU,GAAG,UAAU,CAAC;IACrF,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;8EAC0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,SAAS,GAAG,eAAe,GAAG,SAAS,GAAG,cAAc,CAAC;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sEAAsE;IACtE,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parall/agent-core",
3
- "version": "1.30.0",
3
+ "version": "1.32.0",
4
4
  "description": "Shared agent runtime orchestration helpers for Parall",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -26,7 +26,16 @@
26
26
  "src"
27
27
  ],
28
28
  "dependencies": {
29
- "@parall/sdk": "1.30.0"
29
+ "@opentelemetry/api": "^1.9.0",
30
+ "@opentelemetry/api-logs": "^0.57.0",
31
+ "@opentelemetry/exporter-logs-otlp-proto": "^0.57.0",
32
+ "@opentelemetry/exporter-metrics-otlp-proto": "^0.57.0",
33
+ "@opentelemetry/exporter-trace-otlp-proto": "^0.57.0",
34
+ "@opentelemetry/resources": "^1.30.0",
35
+ "@opentelemetry/sdk-logs": "^0.57.0",
36
+ "@opentelemetry/sdk-metrics": "^1.30.0",
37
+ "@opentelemetry/sdk-trace-node": "^1.30.0",
38
+ "@parall/sdk": "1.32.0"
30
39
  },
31
40
  "devDependencies": {
32
41
  "@types/node": "^22.0.0",