@parall/daemon 1.49.0 → 1.50.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.
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "1.49.0",
3
- "built_at": "2026-07-26T04:12:18.813Z",
2
+ "version": "1.50.0",
3
+ "built_at": "2026-07-27T10:07:52.208Z",
4
4
  "min_node_version": "20.0.0",
5
5
  "files": {
6
6
  "bb-browser-daemon.js": {
@@ -16,29 +16,29 @@
16
16
  "size": 18
17
17
  },
18
18
  "parall-browser-pod.js": {
19
- "sha256": "20a0ee67c5be9cd2352ed8e5a503fa60b8fe86d7dba04ecbe2345397c6e7e00f",
20
- "size": 2899080
19
+ "sha256": "0025fc6f85af4dcfe22a6d532c322bd2bf064f83378d88c77cbcca00a469ed82",
20
+ "size": 2901740
21
21
  },
22
22
  "parall-channel-exec.js": {
23
23
  "sha256": "7c2a6e12483a45e9eb4a42cd7d4cdd3c4fa21dd09ac1347d9a3e177b4ddee930",
24
24
  "size": 7220
25
25
  },
26
26
  "parall-claude-agent.js": {
27
- "sha256": "19203c62234b641e691de41af3444d52876beaabc3fa6abeb7907fd5276da711",
28
- "size": 2732891
27
+ "sha256": "3786edb7e4d2dc22a95f2789416ee1fa1bf191e166d443c868cd8772a6033278",
28
+ "size": 2737538
29
29
  },
30
30
  "parall-codex-agent.js": {
31
- "sha256": "8a80870d3f213ae3d36b5c46b4e4d4e6eb1d91855d5a2ce1c72be43e9cc960ba",
32
- "size": 2774631
31
+ "sha256": "ba13d01de7a89860d75bbc1abd5ea5c9c605cc9104161a8d7960c38f84f7870c",
32
+ "size": 2779278
33
33
  },
34
34
  "parall-daemon.js": {
35
- "sha256": "ef3377051a8310fb760d2ce7826a6654d83225f093a8cdade696ad6216540b3c",
36
- "size": 2961111
35
+ "sha256": "a135d16586ea01a0ed3aa811dac509827efc76d2eb14de6430e1421590afc70e",
36
+ "size": 2963977
37
37
  },
38
38
  "parall-openclaw-agent.js": {
39
39
  "sha256": "856a1c3a9ae0ffef8efe2481fa1171dbeb1d67cccb88616aa9bf16da96a69355",
40
40
  "size": 9923
41
41
  }
42
42
  },
43
- "signature": "sDr+si9wQsnB/LezX3xlTWHu2bHV5DzO5KWEtQz/5Qj2XOWfpKqvb0JjjVFGOxCG07mIGSfj9U5KpeT3GMgbDg=="
43
+ "signature": "KflWD7Xe1CWN7YZuBW3BTXirw4TfZITSwiKrRO+SU/OXNfXf3IC0nm4OWsR5zHb9J+y8cmqzpK2Zz8vXXSgwDw=="
44
44
  }
@@ -63529,6 +63529,12 @@ var ENDPOINTS = {
63529
63529
  ORG_MEMBER: (orgId, userId) => `${API_BASE}/orgs/${orgId}/members/${userId}`,
63530
63530
  ORG_MEMBER_CHATS: (orgId, memberId) => `${API_BASE}/orgs/${orgId}/members/${memberId}/chats`,
63531
63531
  ORG_MEMBER_TASKS: (orgId, memberId) => `${API_BASE}/orgs/${orgId}/members/${memberId}/tasks`,
63532
+ // Org-scoped public profile (title / description). GET readable by every
63533
+ // active member; PATCH is CAS-guarded (expected_version).
63534
+ ORG_MEMBER_PROFILE: (orgId, userId) => `${API_BASE}/orgs/${orgId}/members/${userId}/profile`,
63535
+ // Private agent Instructions — visibility gated server-side
63536
+ // (agent self + Human org admin/owner). Never cached.
63537
+ AGENT_INSTRUCTIONS: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/instructions`,
63532
63538
  REF_SEARCH: (orgId) => `${API_BASE}/orgs/${orgId}/refs/search`,
63533
63539
  // Direct messages (org-scoped, atomic find-or-create + send)
63534
63540
  DM: (orgId) => `${API_BASE}/orgs/${orgId}/dm`,
@@ -63812,6 +63818,11 @@ var ENDPOINTS = {
63812
63818
  SEARCH: (orgId) => `${API_BASE}/orgs/${orgId}/search`,
63813
63819
  // Feature flags (org-scoped, server-evaluated)
63814
63820
  FEATURE_FLAGS: (orgId) => `${API_BASE}/orgs/${orgId}/feature-flags`,
63821
+ // Team templates (org-scoped, owner/admin only)
63822
+ TEMPLATES: (orgId) => `${API_BASE}/orgs/${orgId}/templates`,
63823
+ TEMPLATE: (orgId, templateId) => `${API_BASE}/orgs/${orgId}/templates/${templateId}`,
63824
+ TEMPLATE_DEPLOYMENTS: (orgId) => `${API_BASE}/orgs/${orgId}/template-deployments`,
63825
+ TEMPLATE_DEPLOYMENT: (orgId, deploymentId) => `${API_BASE}/orgs/${orgId}/template-deployments/${deploymentId}`,
63815
63826
  // Billing & Credits (org-scoped)
63816
63827
  BILLING: (orgId) => `${API_BASE}/orgs/${orgId}/billing`,
63817
63828
  BILLING_TRANSACTIONS: (orgId) => `${API_BASE}/orgs/${orgId}/billing/transactions`,
@@ -64246,6 +64257,30 @@ var ParallClient = class _ParallClient {
64246
64257
  async updateOrgMember(orgId, userId, role) {
64247
64258
  return this.request("PATCH", ENDPOINTS.ORG_MEMBER(orgId, userId), { role });
64248
64259
  }
64260
+ /** Org-scoped public profile (title / description) of any active member. */
64261
+ async getMemberProfile(orgId, userId) {
64262
+ return this.request("GET", ENDPOINTS.ORG_MEMBER_PROFILE(orgId, userId));
64263
+ }
64264
+ /**
64265
+ * CAS full-replacement of a member's public profile. Humans edit their
64266
+ * own; Human org admins/owners edit agents'. A stale expected_version
64267
+ * gets 409 PROFILE_VERSION_CONFLICT with error.details.current_version.
64268
+ */
64269
+ async updateMemberProfile(orgId, userId, req) {
64270
+ return this.request("PATCH", ENDPOINTS.ORG_MEMBER_PROFILE(orgId, userId), req);
64271
+ }
64272
+ /** Private agent Instructions — agent self or Human org admin/owner only. */
64273
+ async getAgentInstructions(orgId, agentId) {
64274
+ return this.request("GET", ENDPOINTS.AGENT_INSTRUCTIONS(orgId, agentId));
64275
+ }
64276
+ /**
64277
+ * CAS update of the private Instructions (Human org admin/owner only).
64278
+ * A stale expected_version gets 409 INSTRUCTIONS_VERSION_CONFLICT with
64279
+ * error.details.current_version.
64280
+ */
64281
+ async updateAgentInstructions(orgId, agentId, req) {
64282
+ return this.request("PATCH", ENDPOINTS.AGENT_INSTRUCTIONS(orgId, agentId), req);
64283
+ }
64249
64284
  // Member activity surfaces — chats the member participates in within this org,
64250
64285
  // ordered by most recent activity. Powers the member profile Activity tab.
64251
64286
  async getMemberChats(orgId, memberId, params) {
@@ -65589,6 +65624,22 @@ var ParallClient = class _ParallClient {
65589
65624
  async getFeatureFlags(orgId) {
65590
65625
  return this.request("GET", ENDPOINTS.FEATURE_FLAGS(orgId));
65591
65626
  }
65627
+ // ---- Official Template catalog (org-contextual owner/admin reads + Hire) ----
65628
+ async listOfficialTemplates(orgId) {
65629
+ const response = await this.request("GET", ENDPOINTS.TEMPLATES(orgId));
65630
+ return response.templates ?? [];
65631
+ }
65632
+ async getOfficialTemplate(orgId, templateId) {
65633
+ return this.request("GET", ENDPOINTS.TEMPLATE(orgId, templateId));
65634
+ }
65635
+ async deployTemplate(orgId, request) {
65636
+ return this.request("POST", ENDPOINTS.TEMPLATE_DEPLOYMENTS(orgId), request, void 0, false, {
65637
+ timeoutMs: 185e3
65638
+ });
65639
+ }
65640
+ async getTemplateDeployment(orgId, deploymentId) {
65641
+ return this.request("GET", ENDPOINTS.TEMPLATE_DEPLOYMENT(orgId, deploymentId));
65642
+ }
65592
65643
  // ---- Billing & Credits (org-scoped) ----
65593
65644
  async getBilling(orgId) {
65594
65645
  return this.request("GET", ENDPOINTS.BILLING(orgId));
@@ -51293,6 +51293,17 @@ function laneContextFilePath(contextDir, targetUri, threadRootId) {
51293
51293
 
51294
51294
  // ts/sdk/dist/types.js
51295
51295
  var MENTION_ALL_USER_ID = "all";
51296
+ var MENTION_ALL_HUMANS_USER_ID = "allhuman";
51297
+ var MENTION_ALL_AGENTS_USER_ID = "allagent";
51298
+ function mentionTargetsUser(mentionUserId, userId, userType) {
51299
+ if (mentionUserId === userId || mentionUserId === MENTION_ALL_USER_ID)
51300
+ return true;
51301
+ if (mentionUserId === MENTION_ALL_HUMANS_USER_ID)
51302
+ return userType === "human";
51303
+ if (mentionUserId === MENTION_ALL_AGENTS_USER_ID)
51304
+ return userType === "agent";
51305
+ return false;
51306
+ }
51296
51307
 
51297
51308
  // ts/sdk/dist/constants.js
51298
51309
  var API_BASE = "/api/v1";
@@ -51328,6 +51339,12 @@ var ENDPOINTS = {
51328
51339
  ORG_MEMBER: (orgId, userId) => `${API_BASE}/orgs/${orgId}/members/${userId}`,
51329
51340
  ORG_MEMBER_CHATS: (orgId, memberId) => `${API_BASE}/orgs/${orgId}/members/${memberId}/chats`,
51330
51341
  ORG_MEMBER_TASKS: (orgId, memberId) => `${API_BASE}/orgs/${orgId}/members/${memberId}/tasks`,
51342
+ // Org-scoped public profile (title / description). GET readable by every
51343
+ // active member; PATCH is CAS-guarded (expected_version).
51344
+ ORG_MEMBER_PROFILE: (orgId, userId) => `${API_BASE}/orgs/${orgId}/members/${userId}/profile`,
51345
+ // Private agent Instructions — visibility gated server-side
51346
+ // (agent self + Human org admin/owner). Never cached.
51347
+ AGENT_INSTRUCTIONS: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/instructions`,
51331
51348
  REF_SEARCH: (orgId) => `${API_BASE}/orgs/${orgId}/refs/search`,
51332
51349
  // Direct messages (org-scoped, atomic find-or-create + send)
51333
51350
  DM: (orgId) => `${API_BASE}/orgs/${orgId}/dm`,
@@ -51611,6 +51628,11 @@ var ENDPOINTS = {
51611
51628
  SEARCH: (orgId) => `${API_BASE}/orgs/${orgId}/search`,
51612
51629
  // Feature flags (org-scoped, server-evaluated)
51613
51630
  FEATURE_FLAGS: (orgId) => `${API_BASE}/orgs/${orgId}/feature-flags`,
51631
+ // Team templates (org-scoped, owner/admin only)
51632
+ TEMPLATES: (orgId) => `${API_BASE}/orgs/${orgId}/templates`,
51633
+ TEMPLATE: (orgId, templateId) => `${API_BASE}/orgs/${orgId}/templates/${templateId}`,
51634
+ TEMPLATE_DEPLOYMENTS: (orgId) => `${API_BASE}/orgs/${orgId}/template-deployments`,
51635
+ TEMPLATE_DEPLOYMENT: (orgId, deploymentId) => `${API_BASE}/orgs/${orgId}/template-deployments/${deploymentId}`,
51614
51636
  // Billing & Credits (org-scoped)
51615
51637
  BILLING: (orgId) => `${API_BASE}/orgs/${orgId}/billing`,
51616
51638
  BILLING_TRANSACTIONS: (orgId) => `${API_BASE}/orgs/${orgId}/billing/transactions`,
@@ -52131,6 +52153,30 @@ var ParallClient = class _ParallClient {
52131
52153
  async updateOrgMember(orgId, userId, role) {
52132
52154
  return this.request("PATCH", ENDPOINTS.ORG_MEMBER(orgId, userId), { role });
52133
52155
  }
52156
+ /** Org-scoped public profile (title / description) of any active member. */
52157
+ async getMemberProfile(orgId, userId) {
52158
+ return this.request("GET", ENDPOINTS.ORG_MEMBER_PROFILE(orgId, userId));
52159
+ }
52160
+ /**
52161
+ * CAS full-replacement of a member's public profile. Humans edit their
52162
+ * own; Human org admins/owners edit agents'. A stale expected_version
52163
+ * gets 409 PROFILE_VERSION_CONFLICT with error.details.current_version.
52164
+ */
52165
+ async updateMemberProfile(orgId, userId, req) {
52166
+ return this.request("PATCH", ENDPOINTS.ORG_MEMBER_PROFILE(orgId, userId), req);
52167
+ }
52168
+ /** Private agent Instructions — agent self or Human org admin/owner only. */
52169
+ async getAgentInstructions(orgId, agentId) {
52170
+ return this.request("GET", ENDPOINTS.AGENT_INSTRUCTIONS(orgId, agentId));
52171
+ }
52172
+ /**
52173
+ * CAS update of the private Instructions (Human org admin/owner only).
52174
+ * A stale expected_version gets 409 INSTRUCTIONS_VERSION_CONFLICT with
52175
+ * error.details.current_version.
52176
+ */
52177
+ async updateAgentInstructions(orgId, agentId, req) {
52178
+ return this.request("PATCH", ENDPOINTS.AGENT_INSTRUCTIONS(orgId, agentId), req);
52179
+ }
52134
52180
  // Member activity surfaces — chats the member participates in within this org,
52135
52181
  // ordered by most recent activity. Powers the member profile Activity tab.
52136
52182
  async getMemberChats(orgId, memberId, params) {
@@ -53474,6 +53520,22 @@ var ParallClient = class _ParallClient {
53474
53520
  async getFeatureFlags(orgId) {
53475
53521
  return this.request("GET", ENDPOINTS.FEATURE_FLAGS(orgId));
53476
53522
  }
53523
+ // ---- Official Template catalog (org-contextual owner/admin reads + Hire) ----
53524
+ async listOfficialTemplates(orgId) {
53525
+ const response = await this.request("GET", ENDPOINTS.TEMPLATES(orgId));
53526
+ return response.templates ?? [];
53527
+ }
53528
+ async getOfficialTemplate(orgId, templateId) {
53529
+ return this.request("GET", ENDPOINTS.TEMPLATE(orgId, templateId));
53530
+ }
53531
+ async deployTemplate(orgId, request3) {
53532
+ return this.request("POST", ENDPOINTS.TEMPLATE_DEPLOYMENTS(orgId), request3, void 0, false, {
53533
+ timeoutMs: 185e3
53534
+ });
53535
+ }
53536
+ async getTemplateDeployment(orgId, deploymentId) {
53537
+ return this.request("GET", ENDPOINTS.TEMPLATE_DEPLOYMENT(orgId, deploymentId));
53538
+ }
53477
53539
  // ---- Billing & Credits (org-scoped) ----
53478
53540
  async getBilling(orgId) {
53479
53541
  return this.request("GET", ENDPOINTS.BILLING(orgId));
@@ -55128,6 +55190,17 @@ function buildForkResultPrefix(results) {
55128
55190
  }
55129
55191
 
55130
55192
  // ts/agent-core/dist/prompt-fragments.js
55193
+ function identityFromMe(me) {
55194
+ return {
55195
+ userId: me.id,
55196
+ displayName: me.display_name,
55197
+ title: me.public_profile?.title || void 0,
55198
+ publicDescription: me.public_profile?.description || void 0,
55199
+ // `||` on purpose: an empty-string instructions must also fall back to
55200
+ // the deprecated description alias (empty means "unset" on this wire).
55201
+ instructions: me.agent_profile?.instructions || me.agent_profile?.description || void 0
55202
+ };
55203
+ }
55131
55204
  var PRLL_IDENTITY_BASE = `## You on Parall
55132
55205
 
55133
55206
  Parall is a shared workspace where humans and agents work side by side as equals.
@@ -55149,11 +55222,15 @@ function buildIdentity(agent) {
55149
55222
  const name = sanitizeProfileField(agent.displayName);
55150
55223
  const lines = [PRLL_IDENTITY_BASE, "", "### Your Parall Identity", ""];
55151
55224
  lines.push(`You are **${name}** (\`prll://${agent.userId}\`).`);
55152
- if (agent.description) {
55153
- const description = sanitizeProfileBlock(agent.description);
55154
- if (description) {
55155
- lines.push("", "### Your Agent Profile", "", description);
55156
- }
55225
+ const title = agent.title ? sanitizeProfileField(agent.title) : "";
55226
+ if (title)
55227
+ lines.push(`Title: ${title}`);
55228
+ const about = agent.publicDescription ? sanitizeProfileField(agent.publicDescription) : "";
55229
+ if (about)
55230
+ lines.push(`About: ${about}`);
55231
+ const instructions = sanitizeProfileBlock(agent.instructions ?? agent.description ?? "");
55232
+ if (instructions) {
55233
+ lines.push("", "### Private instructions from your organization admins", "", instructions);
55157
55234
  }
55158
55235
  lines.push("", `When you see \`${agent.userId}\` or \`prll://${agent.userId}\` in messages, mentions, or events \u2014 that's you.`);
55159
55236
  return lines.join("\n");
@@ -58139,7 +58216,7 @@ var ParallAgentGateway = class {
58139
58216
  return { action: "skip" };
58140
58217
  if (chatInfo.type === "group" && chatInfo.agentRoutingMode !== "active") {
58141
58218
  const mentions = content.mentions ?? [];
58142
- const isMentioned = mentions.some((mention) => mention.user_id === this.opts.agentUserId || mention.user_id === MENTION_ALL_USER_ID);
58219
+ const isMentioned = mentions.some((mention) => mentionTargetsUser(mention.user_id, this.opts.agentUserId, "agent"));
58143
58220
  if (!isMentioned)
58144
58221
  return { action: "skip" };
58145
58222
  }
@@ -59139,8 +59216,17 @@ parall whoami
59139
59216
  parall members list # All org members (humans + agents)
59140
59217
  parall agents list # Agents only
59141
59218
  parall users get prll://usr_xxx # Get user details by ID
59219
+ parall members profile prll://usr_xxx # A member's public profile (title / about)
59220
+ parall agents instructions # Your own private Instructions (admin-maintained)
59142
59221
  \`\`\`
59143
59222
 
59223
+ Every member carries an org-scoped public profile: \`title\` (role, e.g.
59224
+ "Platform Lead") and \`description\` (a short about). \`members list\` includes
59225
+ both \u2014 use them to route work to the right person or agent. Your own system
59226
+ prompt already contains your public profile and your private Instructions;
59227
+ you cannot edit either of them \u2014 if yours should change, DM a Human org
59228
+ admin and ask.
59229
+
59144
59230
  Create a hosted agent when the user asks for a Parall-managed runtime. Hosted
59145
59231
  provisioning is asynchronous: creation means the agent identity, API key, and
59146
59232
  machine record were accepted, not that the runtime is online yet. Use \`--wait\`
@@ -61538,7 +61624,7 @@ async function getAgentMeWithLegacyFallback(client, orgId) {
61538
61624
  throw err;
61539
61625
  }
61540
61626
  const user = await client.getMe();
61541
- return { ...user, agent_profile: null };
61627
+ return { ...user, agent_profile: null, public_profile: null };
61542
61628
  }
61543
61629
  }
61544
61630
  function resolveProviderEnv() {
@@ -61579,11 +61665,9 @@ async function main() {
61579
61665
  const agentUserId = me.id;
61580
61666
  const agentLog = childLogger(activeLog, agentUserId);
61581
61667
  activeLog = agentLog;
61582
- const agentIdentity = {
61583
- userId: agentUserId,
61584
- displayName: me.display_name,
61585
- description: me.agent_profile?.description ?? void 0
61586
- };
61668
+ let agentIdentity = identityFromMe(me);
61669
+ let lastIdentitySnapshot = JSON.stringify(agentIdentity);
61670
+ let lastKnownAgentProfile = me.agent_profile;
61587
61671
  const runtimeKey = config.runtimeKey || buildClaudeRuntimeKey(agentUserId);
61588
61672
  const sessionStateFilePath = sessionStateFilePathForRuntime(config.stateDir, runtimeKey);
61589
61673
  const sessionManager = new ClaudeSessionManager(runtimeKey, sessionStateFilePath, agentLog);
@@ -61644,15 +61728,17 @@ async function main() {
61644
61728
  }
61645
61729
  const refreshPlatformConfig = async () => {
61646
61730
  const updated = await configMgr.fetch();
61647
- let refreshedProfile;
61648
- if (updated.modelIsPin === void 0) {
61649
- try {
61650
- refreshedProfile = (await getAgentMeWithLegacyFallback(client, config.orgId)).agent_profile;
61651
- } catch (err) {
61652
- agentLog.warn(`platform config refresh: legacy /agents/me fallback failed: ${String(err)}`);
61653
- }
61731
+ let refreshedMe;
61732
+ try {
61733
+ refreshedMe = await getAgentMeWithLegacyFallback(client, config.orgId);
61734
+ } catch (err) {
61735
+ agentLog.warn(`platform config refresh: /agents/me refetch failed (keeping last-known identity): ${String(err)}`);
61736
+ }
61737
+ if (refreshedMe) {
61738
+ agentIdentity = identityFromMe(refreshedMe);
61739
+ lastKnownAgentProfile = refreshedMe.agent_profile;
61654
61740
  }
61655
- const isPin = deriveModelIsPin(updated, refreshedProfile);
61741
+ const isPin = deriveModelIsPin(updated, lastKnownAgentProfile);
61656
61742
  const localEffort = process.env.CLAUDE_CODE_EFFORT_LEVEL?.trim() || null;
61657
61743
  adapter.updateConfig({
61658
61744
  model: resolveRuntimeModel(isPin, updated.model, config.model) ?? null,
@@ -61667,8 +61753,10 @@ async function main() {
61667
61753
  promptWritten = false;
61668
61754
  agentLog.warn(`system prompt refresh write failed (retrying next refresh): ${String(err)}`);
61669
61755
  }
61670
- if (promptWritten && joinedFragments !== lastCapabilityFragments) {
61756
+ const identitySnapshot = JSON.stringify(agentIdentity);
61757
+ if (promptWritten && (joinedFragments !== lastCapabilityFragments || identitySnapshot !== lastIdentitySnapshot)) {
61671
61758
  lastCapabilityFragments = joinedFragments;
61759
+ lastIdentitySnapshot = identitySnapshot;
61672
61760
  adapter.requestProcessRestart();
61673
61761
  }
61674
61762
  };
@@ -51293,6 +51293,17 @@ function laneContextFilePath(contextDir, targetUri, threadRootId) {
51293
51293
 
51294
51294
  // ts/sdk/dist/types.js
51295
51295
  var MENTION_ALL_USER_ID = "all";
51296
+ var MENTION_ALL_HUMANS_USER_ID = "allhuman";
51297
+ var MENTION_ALL_AGENTS_USER_ID = "allagent";
51298
+ function mentionTargetsUser(mentionUserId, userId, userType) {
51299
+ if (mentionUserId === userId || mentionUserId === MENTION_ALL_USER_ID)
51300
+ return true;
51301
+ if (mentionUserId === MENTION_ALL_HUMANS_USER_ID)
51302
+ return userType === "human";
51303
+ if (mentionUserId === MENTION_ALL_AGENTS_USER_ID)
51304
+ return userType === "agent";
51305
+ return false;
51306
+ }
51296
51307
 
51297
51308
  // ts/sdk/dist/constants.js
51298
51309
  var API_BASE = "/api/v1";
@@ -51328,6 +51339,12 @@ var ENDPOINTS = {
51328
51339
  ORG_MEMBER: (orgId, userId) => `${API_BASE}/orgs/${orgId}/members/${userId}`,
51329
51340
  ORG_MEMBER_CHATS: (orgId, memberId) => `${API_BASE}/orgs/${orgId}/members/${memberId}/chats`,
51330
51341
  ORG_MEMBER_TASKS: (orgId, memberId) => `${API_BASE}/orgs/${orgId}/members/${memberId}/tasks`,
51342
+ // Org-scoped public profile (title / description). GET readable by every
51343
+ // active member; PATCH is CAS-guarded (expected_version).
51344
+ ORG_MEMBER_PROFILE: (orgId, userId) => `${API_BASE}/orgs/${orgId}/members/${userId}/profile`,
51345
+ // Private agent Instructions — visibility gated server-side
51346
+ // (agent self + Human org admin/owner). Never cached.
51347
+ AGENT_INSTRUCTIONS: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/instructions`,
51331
51348
  REF_SEARCH: (orgId) => `${API_BASE}/orgs/${orgId}/refs/search`,
51332
51349
  // Direct messages (org-scoped, atomic find-or-create + send)
51333
51350
  DM: (orgId) => `${API_BASE}/orgs/${orgId}/dm`,
@@ -51611,6 +51628,11 @@ var ENDPOINTS = {
51611
51628
  SEARCH: (orgId) => `${API_BASE}/orgs/${orgId}/search`,
51612
51629
  // Feature flags (org-scoped, server-evaluated)
51613
51630
  FEATURE_FLAGS: (orgId) => `${API_BASE}/orgs/${orgId}/feature-flags`,
51631
+ // Team templates (org-scoped, owner/admin only)
51632
+ TEMPLATES: (orgId) => `${API_BASE}/orgs/${orgId}/templates`,
51633
+ TEMPLATE: (orgId, templateId) => `${API_BASE}/orgs/${orgId}/templates/${templateId}`,
51634
+ TEMPLATE_DEPLOYMENTS: (orgId) => `${API_BASE}/orgs/${orgId}/template-deployments`,
51635
+ TEMPLATE_DEPLOYMENT: (orgId, deploymentId) => `${API_BASE}/orgs/${orgId}/template-deployments/${deploymentId}`,
51614
51636
  // Billing & Credits (org-scoped)
51615
51637
  BILLING: (orgId) => `${API_BASE}/orgs/${orgId}/billing`,
51616
51638
  BILLING_TRANSACTIONS: (orgId) => `${API_BASE}/orgs/${orgId}/billing/transactions`,
@@ -52131,6 +52153,30 @@ var ParallClient = class _ParallClient {
52131
52153
  async updateOrgMember(orgId, userId, role) {
52132
52154
  return this.request("PATCH", ENDPOINTS.ORG_MEMBER(orgId, userId), { role });
52133
52155
  }
52156
+ /** Org-scoped public profile (title / description) of any active member. */
52157
+ async getMemberProfile(orgId, userId) {
52158
+ return this.request("GET", ENDPOINTS.ORG_MEMBER_PROFILE(orgId, userId));
52159
+ }
52160
+ /**
52161
+ * CAS full-replacement of a member's public profile. Humans edit their
52162
+ * own; Human org admins/owners edit agents'. A stale expected_version
52163
+ * gets 409 PROFILE_VERSION_CONFLICT with error.details.current_version.
52164
+ */
52165
+ async updateMemberProfile(orgId, userId, req) {
52166
+ return this.request("PATCH", ENDPOINTS.ORG_MEMBER_PROFILE(orgId, userId), req);
52167
+ }
52168
+ /** Private agent Instructions — agent self or Human org admin/owner only. */
52169
+ async getAgentInstructions(orgId, agentId) {
52170
+ return this.request("GET", ENDPOINTS.AGENT_INSTRUCTIONS(orgId, agentId));
52171
+ }
52172
+ /**
52173
+ * CAS update of the private Instructions (Human org admin/owner only).
52174
+ * A stale expected_version gets 409 INSTRUCTIONS_VERSION_CONFLICT with
52175
+ * error.details.current_version.
52176
+ */
52177
+ async updateAgentInstructions(orgId, agentId, req) {
52178
+ return this.request("PATCH", ENDPOINTS.AGENT_INSTRUCTIONS(orgId, agentId), req);
52179
+ }
52134
52180
  // Member activity surfaces — chats the member participates in within this org,
52135
52181
  // ordered by most recent activity. Powers the member profile Activity tab.
52136
52182
  async getMemberChats(orgId, memberId, params) {
@@ -53474,6 +53520,22 @@ var ParallClient = class _ParallClient {
53474
53520
  async getFeatureFlags(orgId) {
53475
53521
  return this.request("GET", ENDPOINTS.FEATURE_FLAGS(orgId));
53476
53522
  }
53523
+ // ---- Official Template catalog (org-contextual owner/admin reads + Hire) ----
53524
+ async listOfficialTemplates(orgId) {
53525
+ const response = await this.request("GET", ENDPOINTS.TEMPLATES(orgId));
53526
+ return response.templates ?? [];
53527
+ }
53528
+ async getOfficialTemplate(orgId, templateId) {
53529
+ return this.request("GET", ENDPOINTS.TEMPLATE(orgId, templateId));
53530
+ }
53531
+ async deployTemplate(orgId, request3) {
53532
+ return this.request("POST", ENDPOINTS.TEMPLATE_DEPLOYMENTS(orgId), request3, void 0, false, {
53533
+ timeoutMs: 185e3
53534
+ });
53535
+ }
53536
+ async getTemplateDeployment(orgId, deploymentId) {
53537
+ return this.request("GET", ENDPOINTS.TEMPLATE_DEPLOYMENT(orgId, deploymentId));
53538
+ }
53477
53539
  // ---- Billing & Credits (org-scoped) ----
53478
53540
  async getBilling(orgId) {
53479
53541
  return this.request("GET", ENDPOINTS.BILLING(orgId));
@@ -55128,6 +55190,17 @@ function buildForkResultPrefix(results) {
55128
55190
  }
55129
55191
 
55130
55192
  // ts/agent-core/dist/prompt-fragments.js
55193
+ function identityFromMe(me) {
55194
+ return {
55195
+ userId: me.id,
55196
+ displayName: me.display_name,
55197
+ title: me.public_profile?.title || void 0,
55198
+ publicDescription: me.public_profile?.description || void 0,
55199
+ // `||` on purpose: an empty-string instructions must also fall back to
55200
+ // the deprecated description alias (empty means "unset" on this wire).
55201
+ instructions: me.agent_profile?.instructions || me.agent_profile?.description || void 0
55202
+ };
55203
+ }
55131
55204
  var PRLL_IDENTITY_BASE = `## You on Parall
55132
55205
 
55133
55206
  Parall is a shared workspace where humans and agents work side by side as equals.
@@ -55149,11 +55222,15 @@ function buildIdentity(agent) {
55149
55222
  const name = sanitizeProfileField(agent.displayName);
55150
55223
  const lines = [PRLL_IDENTITY_BASE, "", "### Your Parall Identity", ""];
55151
55224
  lines.push(`You are **${name}** (\`prll://${agent.userId}\`).`);
55152
- if (agent.description) {
55153
- const description = sanitizeProfileBlock(agent.description);
55154
- if (description) {
55155
- lines.push("", "### Your Agent Profile", "", description);
55156
- }
55225
+ const title = agent.title ? sanitizeProfileField(agent.title) : "";
55226
+ if (title)
55227
+ lines.push(`Title: ${title}`);
55228
+ const about = agent.publicDescription ? sanitizeProfileField(agent.publicDescription) : "";
55229
+ if (about)
55230
+ lines.push(`About: ${about}`);
55231
+ const instructions = sanitizeProfileBlock(agent.instructions ?? agent.description ?? "");
55232
+ if (instructions) {
55233
+ lines.push("", "### Private instructions from your organization admins", "", instructions);
55157
55234
  }
55158
55235
  lines.push("", `When you see \`${agent.userId}\` or \`prll://${agent.userId}\` in messages, mentions, or events \u2014 that's you.`);
55159
55236
  return lines.join("\n");
@@ -58139,7 +58216,7 @@ var ParallAgentGateway = class {
58139
58216
  return { action: "skip" };
58140
58217
  if (chatInfo.type === "group" && chatInfo.agentRoutingMode !== "active") {
58141
58218
  const mentions = content.mentions ?? [];
58142
- const isMentioned = mentions.some((mention) => mention.user_id === this.opts.agentUserId || mention.user_id === MENTION_ALL_USER_ID);
58219
+ const isMentioned = mentions.some((mention) => mentionTargetsUser(mention.user_id, this.opts.agentUserId, "agent"));
58143
58220
  if (!isMentioned)
58144
58221
  return { action: "skip" };
58145
58222
  }
@@ -59139,8 +59216,17 @@ parall whoami
59139
59216
  parall members list # All org members (humans + agents)
59140
59217
  parall agents list # Agents only
59141
59218
  parall users get prll://usr_xxx # Get user details by ID
59219
+ parall members profile prll://usr_xxx # A member's public profile (title / about)
59220
+ parall agents instructions # Your own private Instructions (admin-maintained)
59142
59221
  \`\`\`
59143
59222
 
59223
+ Every member carries an org-scoped public profile: \`title\` (role, e.g.
59224
+ "Platform Lead") and \`description\` (a short about). \`members list\` includes
59225
+ both \u2014 use them to route work to the right person or agent. Your own system
59226
+ prompt already contains your public profile and your private Instructions;
59227
+ you cannot edit either of them \u2014 if yours should change, DM a Human org
59228
+ admin and ask.
59229
+
59144
59230
  Create a hosted agent when the user asks for a Parall-managed runtime. Hosted
59145
59231
  provisioning is asynchronous: creation means the agent identity, API key, and
59146
59232
  machine record were accepted, not that the runtime is online yet. Use \`--wait\`
@@ -62703,7 +62789,7 @@ async function getAgentMeWithLegacyFallback(client, orgId) {
62703
62789
  throw err;
62704
62790
  }
62705
62791
  const user = await client.getMe();
62706
- return { ...user, agent_profile: null };
62792
+ return { ...user, agent_profile: null, public_profile: null };
62707
62793
  }
62708
62794
  }
62709
62795
  function resolveProviderEnv() {
@@ -62743,11 +62829,9 @@ async function main() {
62743
62829
  ensureParallProvider(config.codexHome, config.apiUrl, agentLog);
62744
62830
  agentLog.info("parall custom provider configured (Responses API HTTP/SSE mode)");
62745
62831
  }
62746
- const agentIdentity = {
62747
- userId: agentUserId,
62748
- displayName: me.display_name,
62749
- description: me.agent_profile?.description ?? void 0
62750
- };
62832
+ let agentIdentity = identityFromMe(me);
62833
+ let lastIdentitySnapshot = JSON.stringify(agentIdentity);
62834
+ let lastKnownAgentProfile = me.agent_profile;
62751
62835
  const runtimeKey = config.runtimeKey || buildCodexRuntimeKey(agentUserId);
62752
62836
  const mainContextFilePath = contextFilePathForSession(config.stateDir, runtimeKey);
62753
62837
  const sessionStateFilePath = sessionStateFilePathForRuntime(config.stateDir, runtimeKey);
@@ -62797,15 +62881,17 @@ async function main() {
62797
62881
  });
62798
62882
  const refreshPlatformConfig = async () => {
62799
62883
  const updated = await configMgr.fetch();
62800
- let refreshedProfile;
62801
- if (updated.modelIsPin === void 0) {
62802
- try {
62803
- refreshedProfile = (await getAgentMeWithLegacyFallback(client, config.orgId)).agent_profile;
62804
- } catch (err) {
62805
- agentLog.warn(`platform config refresh: legacy /agents/me fallback failed: ${String(err)}`);
62806
- }
62884
+ let refreshedMe;
62885
+ try {
62886
+ refreshedMe = await getAgentMeWithLegacyFallback(client, config.orgId);
62887
+ } catch (err) {
62888
+ agentLog.warn(`platform config refresh: /agents/me refetch failed (keeping last-known identity): ${String(err)}`);
62889
+ }
62890
+ if (refreshedMe) {
62891
+ agentIdentity = identityFromMe(refreshedMe);
62892
+ lastKnownAgentProfile = refreshedMe.agent_profile;
62807
62893
  }
62808
- const isPin = deriveModelIsPin(updated, refreshedProfile);
62894
+ const isPin = deriveModelIsPin(updated, lastKnownAgentProfile);
62809
62895
  adapter.updateConfig({
62810
62896
  model: resolveRuntimeModel(isPin, updated.model, config.model) ?? null,
62811
62897
  reasoningEffort: updated.thinkingEffort ?? config.reasoningEffort ?? null
@@ -62820,8 +62906,10 @@ async function main() {
62820
62906
  promptWritten = false;
62821
62907
  agentLog.warn(`system prompt refresh write failed (retrying next refresh): ${String(err)}`);
62822
62908
  }
62823
- if (promptWritten && joinedFragments !== lastCapabilityFragments) {
62909
+ const identitySnapshot = JSON.stringify(agentIdentity);
62910
+ if (promptWritten && (joinedFragments !== lastCapabilityFragments || identitySnapshot !== lastIdentitySnapshot)) {
62824
62911
  lastCapabilityFragments = joinedFragments;
62912
+ lastIdentitySnapshot = identitySnapshot;
62825
62913
  adapter.requestProcessRestart();
62826
62914
  }
62827
62915
  };
@@ -168,6 +168,12 @@ var init_constants = __esm({
168
168
  ORG_MEMBER: (orgId, userId) => `${API_BASE}/orgs/${orgId}/members/${userId}`,
169
169
  ORG_MEMBER_CHATS: (orgId, memberId) => `${API_BASE}/orgs/${orgId}/members/${memberId}/chats`,
170
170
  ORG_MEMBER_TASKS: (orgId, memberId) => `${API_BASE}/orgs/${orgId}/members/${memberId}/tasks`,
171
+ // Org-scoped public profile (title / description). GET readable by every
172
+ // active member; PATCH is CAS-guarded (expected_version).
173
+ ORG_MEMBER_PROFILE: (orgId, userId) => `${API_BASE}/orgs/${orgId}/members/${userId}/profile`,
174
+ // Private agent Instructions — visibility gated server-side
175
+ // (agent self + Human org admin/owner). Never cached.
176
+ AGENT_INSTRUCTIONS: (orgId, agentId) => `${API_BASE}/orgs/${orgId}/agents/${agentId}/instructions`,
171
177
  REF_SEARCH: (orgId) => `${API_BASE}/orgs/${orgId}/refs/search`,
172
178
  // Direct messages (org-scoped, atomic find-or-create + send)
173
179
  DM: (orgId) => `${API_BASE}/orgs/${orgId}/dm`,
@@ -451,6 +457,11 @@ var init_constants = __esm({
451
457
  SEARCH: (orgId) => `${API_BASE}/orgs/${orgId}/search`,
452
458
  // Feature flags (org-scoped, server-evaluated)
453
459
  FEATURE_FLAGS: (orgId) => `${API_BASE}/orgs/${orgId}/feature-flags`,
460
+ // Team templates (org-scoped, owner/admin only)
461
+ TEMPLATES: (orgId) => `${API_BASE}/orgs/${orgId}/templates`,
462
+ TEMPLATE: (orgId, templateId) => `${API_BASE}/orgs/${orgId}/templates/${templateId}`,
463
+ TEMPLATE_DEPLOYMENTS: (orgId) => `${API_BASE}/orgs/${orgId}/template-deployments`,
464
+ TEMPLATE_DEPLOYMENT: (orgId, deploymentId) => `${API_BASE}/orgs/${orgId}/template-deployments/${deploymentId}`,
454
465
  // Billing & Credits (org-scoped)
455
466
  BILLING: (orgId) => `${API_BASE}/orgs/${orgId}/billing`,
456
467
  BILLING_TRANSACTIONS: (orgId) => `${API_BASE}/orgs/${orgId}/billing/transactions`,
@@ -1015,6 +1026,30 @@ var init_client = __esm({
1015
1026
  async updateOrgMember(orgId, userId, role) {
1016
1027
  return this.request("PATCH", ENDPOINTS.ORG_MEMBER(orgId, userId), { role });
1017
1028
  }
1029
+ /** Org-scoped public profile (title / description) of any active member. */
1030
+ async getMemberProfile(orgId, userId) {
1031
+ return this.request("GET", ENDPOINTS.ORG_MEMBER_PROFILE(orgId, userId));
1032
+ }
1033
+ /**
1034
+ * CAS full-replacement of a member's public profile. Humans edit their
1035
+ * own; Human org admins/owners edit agents'. A stale expected_version
1036
+ * gets 409 PROFILE_VERSION_CONFLICT with error.details.current_version.
1037
+ */
1038
+ async updateMemberProfile(orgId, userId, req) {
1039
+ return this.request("PATCH", ENDPOINTS.ORG_MEMBER_PROFILE(orgId, userId), req);
1040
+ }
1041
+ /** Private agent Instructions — agent self or Human org admin/owner only. */
1042
+ async getAgentInstructions(orgId, agentId) {
1043
+ return this.request("GET", ENDPOINTS.AGENT_INSTRUCTIONS(orgId, agentId));
1044
+ }
1045
+ /**
1046
+ * CAS update of the private Instructions (Human org admin/owner only).
1047
+ * A stale expected_version gets 409 INSTRUCTIONS_VERSION_CONFLICT with
1048
+ * error.details.current_version.
1049
+ */
1050
+ async updateAgentInstructions(orgId, agentId, req) {
1051
+ return this.request("PATCH", ENDPOINTS.AGENT_INSTRUCTIONS(orgId, agentId), req);
1052
+ }
1018
1053
  // Member activity surfaces — chats the member participates in within this org,
1019
1054
  // ordered by most recent activity. Powers the member profile Activity tab.
1020
1055
  async getMemberChats(orgId, memberId, params) {
@@ -2358,6 +2393,22 @@ var init_client = __esm({
2358
2393
  async getFeatureFlags(orgId) {
2359
2394
  return this.request("GET", ENDPOINTS.FEATURE_FLAGS(orgId));
2360
2395
  }
2396
+ // ---- Official Template catalog (org-contextual owner/admin reads + Hire) ----
2397
+ async listOfficialTemplates(orgId) {
2398
+ const response = await this.request("GET", ENDPOINTS.TEMPLATES(orgId));
2399
+ return response.templates ?? [];
2400
+ }
2401
+ async getOfficialTemplate(orgId, templateId) {
2402
+ return this.request("GET", ENDPOINTS.TEMPLATE(orgId, templateId));
2403
+ }
2404
+ async deployTemplate(orgId, request3) {
2405
+ return this.request("POST", ENDPOINTS.TEMPLATE_DEPLOYMENTS(orgId), request3, void 0, false, {
2406
+ timeoutMs: 185e3
2407
+ });
2408
+ }
2409
+ async getTemplateDeployment(orgId, deploymentId) {
2410
+ return this.request("GET", ENDPOINTS.TEMPLATE_DEPLOYMENT(orgId, deploymentId));
2411
+ }
2361
2412
  // ---- Billing & Credits (org-scoped) ----
2362
2413
  async getBilling(orgId) {
2363
2414
  return this.request("GET", ENDPOINTS.BILLING(orgId));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@parall/daemon",
3
- "version": "1.49.0",
3
+ "version": "1.50.0",
4
4
  "description": "Parall local agent runtime — daemon supervisor + bridge runtimes, bundled as standalone JS files",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -33,11 +33,11 @@
33
33
  "@aws-sdk/client-s3": "3.984.0",
34
34
  "@pinixai/bb-browser-pro": "0.15.0",
35
35
  "ws": "^8.18.0",
36
- "@parall/agent-core": "1.49.0",
37
- "@parall/sdk": "1.49.0",
38
- "@parall/codex-agent": "1.49.0",
39
- "@parall/openclaw-agent": "1.49.0",
40
- "@parall/claude-agent": "1.49.0"
36
+ "@parall/agent-core": "1.50.0",
37
+ "@parall/sdk": "1.50.0",
38
+ "@parall/claude-agent": "1.50.0",
39
+ "@parall/codex-agent": "1.50.0",
40
+ "@parall/openclaw-agent": "1.50.0"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/node": "^22.0.0",