@acnlabs/paperclip-plugin-acn 0.1.1 → 0.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/dist/ui/index.js CHANGED
@@ -116,8 +116,9 @@ var STATUS_COLORS = {
116
116
  accepted: "#d97706"
117
117
  };
118
118
  function StatusBadge({ status }) {
119
- const color = STATUS_COLORS[status] ?? "#6b7280";
120
- return /* @__PURE__ */ jsx("span", { style: styles.badge(color), children: status.replace(/_/g, " ") });
119
+ const label = status && status.trim() ? status : "unknown";
120
+ const color = STATUS_COLORS[label] ?? "#6b7280";
121
+ return /* @__PURE__ */ jsx("span", { style: styles.badge(color), children: label.replace(/_/g, " ") });
121
122
  }
122
123
  function ParticipationItem({
123
124
  p
@@ -237,6 +238,25 @@ function ACNIssueTab({ context }) {
237
238
  ] }) });
238
239
  }
239
240
  if (!data) {
241
+ return /* @__PURE__ */ jsx("div", { style: styles.container, children: /* @__PURE__ */ jsx("span", { style: styles.muted, children: "This issue is not linked to ACN work or a task." }) });
242
+ }
243
+ if (data.source === "org_work" || data.work_id) {
244
+ return /* @__PURE__ */ jsxs("div", { style: styles.container, children: [
245
+ /* @__PURE__ */ jsxs("div", { style: styles.row, children: [
246
+ /* @__PURE__ */ jsx("span", { style: styles.label, children: "ACN Work" }),
247
+ /* @__PURE__ */ jsx("span", { style: styles.mono, children: data.work_id ?? "\u2014" })
248
+ ] }),
249
+ /* @__PURE__ */ jsxs("div", { style: styles.row, children: [
250
+ /* @__PURE__ */ jsx("span", { style: styles.label, children: "ACN Org" }),
251
+ /* @__PURE__ */ jsx("span", { style: styles.mono, children: data.org_id ?? "\u2014" })
252
+ ] }),
253
+ data.status ? /* @__PURE__ */ jsxs("div", { style: styles.row, children: [
254
+ /* @__PURE__ */ jsx("span", { style: styles.label, children: "Status" }),
255
+ /* @__PURE__ */ jsx(StatusBadge, { status: data.status })
256
+ ] }) : /* @__PURE__ */ jsx("div", { style: { ...styles.muted, marginTop: "8px" }, children: "Linked via Org Harness. Moving this issue to done/cancelled PATCHes Org work status when autoApproveOnDone is enabled (done) or always (cancelled)." })
257
+ ] });
258
+ }
259
+ if (!data.task_id) {
240
260
  return /* @__PURE__ */ jsx("div", { style: styles.container, children: /* @__PURE__ */ jsx("span", { style: styles.muted, children: "This issue is not linked to an ACN task." }) });
241
261
  }
242
262
  const submittedParticipation = data.participations.find(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/ui/index.tsx"],
4
- "sourcesContent": ["import React, { useState } from \"react\";\nimport {\n usePluginAction,\n usePluginData,\n type PluginDetailTabProps,\n} from \"@paperclipai/plugin-sdk/ui\";\n\n// \u2500\u2500 Types shared with worker bridge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface AcnTaskInfo {\n task_id: string;\n title: string;\n status: string;\n /** Decimal string from ACN backend (e.g. \"10.00\"). */\n reward: string;\n reward_currency: string;\n participations: Array<{\n participation_id: string;\n agent_id: string;\n status: string;\n submission_content: string | null;\n submitted_at: string | null;\n resubmit_count: number;\n }>;\n}\n\n// \u2500\u2500 Minimal inline styles (no Tailwind dependency) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst styles = {\n container: {\n padding: \"16px\",\n fontFamily: \"inherit\",\n fontSize: \"13px\",\n color: \"var(--color-fg-default, #1a1a1a)\",\n } as React.CSSProperties,\n\n row: {\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"baseline\",\n marginBottom: \"6px\",\n } as React.CSSProperties,\n\n label: {\n fontWeight: 600,\n color: \"var(--color-fg-muted, #666)\",\n minWidth: \"100px\",\n flexShrink: 0,\n } as React.CSSProperties,\n\n badge: (color: string): React.CSSProperties => ({\n display: \"inline-block\",\n padding: \"2px 8px\",\n borderRadius: \"12px\",\n fontSize: \"11px\",\n fontWeight: 600,\n background: color,\n color: \"#fff\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.04em\",\n }),\n\n section: {\n marginTop: \"16px\",\n borderTop: \"1px solid var(--color-border-default, #e5e5e5)\",\n paddingTop: \"12px\",\n } as React.CSSProperties,\n\n sectionTitle: {\n fontWeight: 700,\n marginBottom: \"8px\",\n fontSize: \"12px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.06em\",\n color: \"var(--color-fg-muted, #888)\",\n } as React.CSSProperties,\n\n participationCard: {\n background: \"var(--color-bg-subtle, #f6f6f6)\",\n borderRadius: \"6px\",\n padding: \"10px 12px\",\n marginBottom: \"8px\",\n } as React.CSSProperties,\n\n pre: {\n background: \"var(--color-bg-subtle, #f0f0f0)\",\n borderRadius: \"4px\",\n padding: \"8px\",\n fontSize: \"12px\",\n overflowX: \"auto\",\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n marginTop: \"6px\",\n } as React.CSSProperties,\n\n actionRow: {\n display: \"flex\",\n gap: \"8px\",\n marginTop: \"16px\",\n } as React.CSSProperties,\n\n btn: (variant: \"approve\" | \"reject\" | \"neutral\"): React.CSSProperties => ({\n padding: \"6px 16px\",\n borderRadius: \"6px\",\n border: \"none\",\n cursor: \"pointer\",\n fontWeight: 600,\n fontSize: \"13px\",\n background:\n variant === \"approve\"\n ? \"#16a34a\"\n : variant === \"reject\"\n ? \"#dc2626\"\n : \"var(--color-bg-subtle, #e5e5e5)\",\n color: variant === \"neutral\" ? \"var(--color-fg-default, #333)\" : \"#fff\",\n opacity: 1,\n transition: \"opacity 0.15s\",\n }),\n\n textarea: {\n width: \"100%\",\n minHeight: \"64px\",\n borderRadius: \"6px\",\n border: \"1px solid var(--color-border-default, #ccc)\",\n padding: \"6px 8px\",\n fontSize: \"12px\",\n fontFamily: \"inherit\",\n resize: \"vertical\",\n boxSizing: \"border-box\",\n marginTop: \"8px\",\n } as React.CSSProperties,\n\n muted: {\n color: \"var(--color-fg-muted, #888)\",\n fontSize: \"12px\",\n } as React.CSSProperties,\n\n mono: {\n fontFamily: \"monospace\",\n fontSize: \"11px\",\n background: \"var(--color-bg-subtle, #f0f0f0)\",\n padding: \"1px 5px\",\n borderRadius: \"3px\",\n } as React.CSSProperties,\n} as const;\n\n// \u2500\u2500 Status badge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst STATUS_COLORS: Record<string, string> = {\n open: \"#2563eb\",\n in_progress: \"#d97706\",\n in_review: \"#7c3aed\",\n completed: \"#16a34a\",\n cancelled: \"#6b7280\",\n rejected: \"#dc2626\",\n submitted: \"#7c3aed\",\n accepted: \"#d97706\",\n};\n\nfunction StatusBadge({ status }: { status: string }) {\n const color = STATUS_COLORS[status] ?? \"#6b7280\";\n return <span style={styles.badge(color)}>{status.replace(/_/g, \" \")}</span>;\n}\n\n// \u2500\u2500 Participation item \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction ParticipationItem({\n p,\n}: {\n p: AcnTaskInfo[\"participations\"][number];\n}) {\n const [expanded, setExpanded] = useState(false);\n const hasSubmission = Boolean(p.submission_content);\n\n return (\n <div style={styles.participationCard}>\n <div style={styles.row}>\n <span style={styles.label}>Agent</span>\n <span style={styles.mono}>{p.agent_id}</span>\n </div>\n <div style={styles.row}>\n <span style={styles.label}>Status</span>\n <StatusBadge status={p.status} />\n {p.resubmit_count > 0 && (\n <span style={styles.muted}>({p.resubmit_count} resubmit{p.resubmit_count > 1 ? \"s\" : \"\"})</span>\n )}\n </div>\n {p.submitted_at && (\n <div style={styles.row}>\n <span style={styles.label}>Submitted</span>\n <span style={styles.muted}>{new Date(p.submitted_at).toLocaleString()}</span>\n </div>\n )}\n {hasSubmission && (\n <>\n <button\n type=\"button\"\n style={{ ...styles.btn(\"neutral\"), marginTop: \"6px\", fontSize: \"11px\", padding: \"3px 10px\" }}\n onClick={() => setExpanded((v) => !v)}\n >\n {expanded ? \"Hide submission\" : \"Show submission\"}\n </button>\n {expanded && <pre style={styles.pre}>{p.submission_content}</pre>}\n </>\n )}\n </div>\n );\n}\n\n// \u2500\u2500 Review panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction ReviewPanel({\n taskId,\n onDone,\n}: {\n taskId: string;\n onDone: () => void;\n}) {\n const [feedback, setFeedback] = useState(\"\");\n const [pending, setPending] = useState<\"approve\" | \"reject\" | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const review = usePluginAction(\"acn-review\");\n\n async function handleReview(approved: boolean) {\n const action = approved ? \"approve\" : \"reject\";\n setPending(action);\n setError(null);\n try {\n await review({ taskId, approved, feedback: feedback.trim() || undefined });\n onDone();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Review failed\");\n } finally {\n setPending(null);\n }\n }\n\n return (\n <div style={styles.section}>\n <div style={styles.sectionTitle}>Review Submission</div>\n <textarea\n style={styles.textarea}\n placeholder=\"Optional feedback\u2026\"\n value={feedback}\n onChange={(e) => setFeedback(e.target.value)}\n disabled={pending !== null}\n />\n {error && <div style={{ color: \"#dc2626\", fontSize: \"12px\", marginTop: \"4px\" }}>{error}</div>}\n <div style={styles.actionRow}>\n <button\n type=\"button\"\n style={{ ...styles.btn(\"approve\"), opacity: pending ? 0.6 : 1 }}\n disabled={pending !== null}\n onClick={() => void handleReview(true)}\n >\n {pending === \"approve\" ? \"Approving\u2026\" : \"Approve\"}\n </button>\n <button\n type=\"button\"\n style={{ ...styles.btn(\"reject\"), opacity: pending ? 0.6 : 1 }}\n disabled={pending !== null}\n onClick={() => void handleReview(false)}\n >\n {pending === \"reject\" ? \"Rejecting\u2026\" : \"Reject\"}\n </button>\n </div>\n </div>\n );\n}\n\n// \u2500\u2500 Main ACN Issue Tab \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function ACNIssueTab({ context }: PluginDetailTabProps) {\n const issueId = context.entityId;\n const companyId = context.companyId;\n const [reviewDone, setReviewDone] = useState(false);\n\n const { data, loading, error } = usePluginData<AcnTaskInfo | null>(\n \"acn-task-info\",\n issueId && companyId ? { issueId, companyId } : {},\n );\n\n if (!issueId) {\n return <div style={styles.container}><span style={styles.muted}>No issue selected.</span></div>;\n }\n\n if (loading) {\n return <div style={styles.container}><span style={styles.muted}>Loading\u2026</span></div>;\n }\n\n if (error) {\n return (\n <div style={styles.container}>\n <span style={{ color: \"#dc2626\" }}>Failed to load ACN data: {error.message}</span>\n </div>\n );\n }\n\n if (!data) {\n return (\n <div style={styles.container}>\n <span style={styles.muted}>This issue is not linked to an ACN task.</span>\n </div>\n );\n }\n\n const submittedParticipation = data.participations.find(\n (p) => p.status === \"submitted\",\n );\n const canReview = !reviewDone && Boolean(submittedParticipation);\n\n return (\n <div style={styles.container}>\n {/* Task meta */}\n <div style={styles.row}>\n <span style={styles.label}>ACN Task</span>\n <span style={styles.mono}>{data.task_id}</span>\n </div>\n <div style={styles.row}>\n <span style={styles.label}>Status</span>\n <StatusBadge status={data.status} />\n </div>\n {parseFloat(data.reward ?? \"0\") > 0 && (\n <div style={styles.row}>\n <span style={styles.label}>Reward</span>\n <span>{data.reward} {data.reward_currency}</span>\n </div>\n )}\n\n {/* Participations */}\n {data.participations.length > 0 && (\n <div style={styles.section}>\n <div style={styles.sectionTitle}>\n Participants ({data.participations.length})\n </div>\n {data.participations.map((p) => (\n <ParticipationItem key={p.participation_id} p={p} />\n ))}\n </div>\n )}\n\n {/* Review panel \u2014 shown when there is a pending submission */}\n {canReview && (\n <ReviewPanel\n taskId={data.task_id}\n onDone={() => {\n setReviewDone(true);\n setTimeout(() => setReviewDone(false), 3000);\n }}\n />\n )}\n\n {reviewDone && (\n <div style={{ ...styles.section, color: \"#16a34a\", fontWeight: 600 }}>\n Review submitted. ACN will process the result.\n </div>\n )}\n </div>\n );\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import React, { useState } from \"react\";\nimport {\n usePluginAction,\n usePluginData,\n type PluginDetailTabProps,\n} from \"@paperclipai/plugin-sdk/ui\";\n\n// \u2500\u2500 Types shared with worker bridge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface AcnTaskInfo {\n /** Org Harness work path vs legacy Task Pool mirror. */\n source?: \"org_work\" | \"task_pool\";\n work_id?: string | null;\n org_id?: string | null;\n task_id: string | null;\n title: string | null;\n status: string | null;\n /** Decimal string from ACN backend (e.g. \"10.00\"). */\n reward: string | null;\n reward_currency: string | null;\n participations: Array<{\n participation_id: string;\n agent_id: string;\n status: string;\n submission_content: string | null;\n submitted_at: string | null;\n resubmit_count: number;\n }>;\n}\n\n// \u2500\u2500 Minimal inline styles (no Tailwind dependency) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst styles = {\n container: {\n padding: \"16px\",\n fontFamily: \"inherit\",\n fontSize: \"13px\",\n color: \"var(--color-fg-default, #1a1a1a)\",\n } as React.CSSProperties,\n\n row: {\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"baseline\",\n marginBottom: \"6px\",\n } as React.CSSProperties,\n\n label: {\n fontWeight: 600,\n color: \"var(--color-fg-muted, #666)\",\n minWidth: \"100px\",\n flexShrink: 0,\n } as React.CSSProperties,\n\n badge: (color: string): React.CSSProperties => ({\n display: \"inline-block\",\n padding: \"2px 8px\",\n borderRadius: \"12px\",\n fontSize: \"11px\",\n fontWeight: 600,\n background: color,\n color: \"#fff\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.04em\",\n }),\n\n section: {\n marginTop: \"16px\",\n borderTop: \"1px solid var(--color-border-default, #e5e5e5)\",\n paddingTop: \"12px\",\n } as React.CSSProperties,\n\n sectionTitle: {\n fontWeight: 700,\n marginBottom: \"8px\",\n fontSize: \"12px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.06em\",\n color: \"var(--color-fg-muted, #888)\",\n } as React.CSSProperties,\n\n participationCard: {\n background: \"var(--color-bg-subtle, #f6f6f6)\",\n borderRadius: \"6px\",\n padding: \"10px 12px\",\n marginBottom: \"8px\",\n } as React.CSSProperties,\n\n pre: {\n background: \"var(--color-bg-subtle, #f0f0f0)\",\n borderRadius: \"4px\",\n padding: \"8px\",\n fontSize: \"12px\",\n overflowX: \"auto\",\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n marginTop: \"6px\",\n } as React.CSSProperties,\n\n actionRow: {\n display: \"flex\",\n gap: \"8px\",\n marginTop: \"16px\",\n } as React.CSSProperties,\n\n btn: (variant: \"approve\" | \"reject\" | \"neutral\"): React.CSSProperties => ({\n padding: \"6px 16px\",\n borderRadius: \"6px\",\n border: \"none\",\n cursor: \"pointer\",\n fontWeight: 600,\n fontSize: \"13px\",\n background:\n variant === \"approve\"\n ? \"#16a34a\"\n : variant === \"reject\"\n ? \"#dc2626\"\n : \"var(--color-bg-subtle, #e5e5e5)\",\n color: variant === \"neutral\" ? \"var(--color-fg-default, #333)\" : \"#fff\",\n opacity: 1,\n transition: \"opacity 0.15s\",\n }),\n\n textarea: {\n width: \"100%\",\n minHeight: \"64px\",\n borderRadius: \"6px\",\n border: \"1px solid var(--color-border-default, #ccc)\",\n padding: \"6px 8px\",\n fontSize: \"12px\",\n fontFamily: \"inherit\",\n resize: \"vertical\",\n boxSizing: \"border-box\",\n marginTop: \"8px\",\n } as React.CSSProperties,\n\n muted: {\n color: \"var(--color-fg-muted, #888)\",\n fontSize: \"12px\",\n } as React.CSSProperties,\n\n mono: {\n fontFamily: \"monospace\",\n fontSize: \"11px\",\n background: \"var(--color-bg-subtle, #f0f0f0)\",\n padding: \"1px 5px\",\n borderRadius: \"3px\",\n } as React.CSSProperties,\n} as const;\n\n// \u2500\u2500 Status badge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst STATUS_COLORS: Record<string, string> = {\n open: \"#2563eb\",\n in_progress: \"#d97706\",\n in_review: \"#7c3aed\",\n completed: \"#16a34a\",\n cancelled: \"#6b7280\",\n rejected: \"#dc2626\",\n submitted: \"#7c3aed\",\n accepted: \"#d97706\",\n};\n\nfunction StatusBadge({ status }: { status: string | null | undefined }) {\n const label = status && status.trim() ? status : \"unknown\";\n const color = STATUS_COLORS[label] ?? \"#6b7280\";\n return <span style={styles.badge(color)}>{label.replace(/_/g, \" \")}</span>;\n}\n\n// \u2500\u2500 Participation item \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction ParticipationItem({\n p,\n}: {\n p: AcnTaskInfo[\"participations\"][number];\n}) {\n const [expanded, setExpanded] = useState(false);\n const hasSubmission = Boolean(p.submission_content);\n\n return (\n <div style={styles.participationCard}>\n <div style={styles.row}>\n <span style={styles.label}>Agent</span>\n <span style={styles.mono}>{p.agent_id}</span>\n </div>\n <div style={styles.row}>\n <span style={styles.label}>Status</span>\n <StatusBadge status={p.status} />\n {p.resubmit_count > 0 && (\n <span style={styles.muted}>({p.resubmit_count} resubmit{p.resubmit_count > 1 ? \"s\" : \"\"})</span>\n )}\n </div>\n {p.submitted_at && (\n <div style={styles.row}>\n <span style={styles.label}>Submitted</span>\n <span style={styles.muted}>{new Date(p.submitted_at).toLocaleString()}</span>\n </div>\n )}\n {hasSubmission && (\n <>\n <button\n type=\"button\"\n style={{ ...styles.btn(\"neutral\"), marginTop: \"6px\", fontSize: \"11px\", padding: \"3px 10px\" }}\n onClick={() => setExpanded((v) => !v)}\n >\n {expanded ? \"Hide submission\" : \"Show submission\"}\n </button>\n {expanded && <pre style={styles.pre}>{p.submission_content}</pre>}\n </>\n )}\n </div>\n );\n}\n\n// \u2500\u2500 Review panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction ReviewPanel({\n taskId,\n onDone,\n}: {\n taskId: string;\n onDone: () => void;\n}) {\n const [feedback, setFeedback] = useState(\"\");\n const [pending, setPending] = useState<\"approve\" | \"reject\" | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const review = usePluginAction(\"acn-review\");\n\n async function handleReview(approved: boolean) {\n const action = approved ? \"approve\" : \"reject\";\n setPending(action);\n setError(null);\n try {\n await review({ taskId, approved, feedback: feedback.trim() || undefined });\n onDone();\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Review failed\");\n } finally {\n setPending(null);\n }\n }\n\n return (\n <div style={styles.section}>\n <div style={styles.sectionTitle}>Review Submission</div>\n <textarea\n style={styles.textarea}\n placeholder=\"Optional feedback\u2026\"\n value={feedback}\n onChange={(e) => setFeedback(e.target.value)}\n disabled={pending !== null}\n />\n {error && <div style={{ color: \"#dc2626\", fontSize: \"12px\", marginTop: \"4px\" }}>{error}</div>}\n <div style={styles.actionRow}>\n <button\n type=\"button\"\n style={{ ...styles.btn(\"approve\"), opacity: pending ? 0.6 : 1 }}\n disabled={pending !== null}\n onClick={() => void handleReview(true)}\n >\n {pending === \"approve\" ? \"Approving\u2026\" : \"Approve\"}\n </button>\n <button\n type=\"button\"\n style={{ ...styles.btn(\"reject\"), opacity: pending ? 0.6 : 1 }}\n disabled={pending !== null}\n onClick={() => void handleReview(false)}\n >\n {pending === \"reject\" ? \"Rejecting\u2026\" : \"Reject\"}\n </button>\n </div>\n </div>\n );\n}\n\n// \u2500\u2500 Main ACN Issue Tab \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function ACNIssueTab({ context }: PluginDetailTabProps) {\n const issueId = context.entityId;\n const companyId = context.companyId;\n const [reviewDone, setReviewDone] = useState(false);\n\n const { data, loading, error } = usePluginData<AcnTaskInfo | null>(\n \"acn-task-info\",\n issueId && companyId ? { issueId, companyId } : {},\n );\n\n if (!issueId) {\n return <div style={styles.container}><span style={styles.muted}>No issue selected.</span></div>;\n }\n\n if (loading) {\n return <div style={styles.container}><span style={styles.muted}>Loading\u2026</span></div>;\n }\n\n if (error) {\n return (\n <div style={styles.container}>\n <span style={{ color: \"#dc2626\" }}>Failed to load ACN data: {error.message}</span>\n </div>\n );\n }\n\n if (!data) {\n return (\n <div style={styles.container}>\n <span style={styles.muted}>This issue is not linked to ACN work or a task.</span>\n </div>\n );\n }\n\n // Org Harness path \u2014 no Task Pool review UI; done/cancelled sync via C3 PATCH.\n if (data.source === \"org_work\" || data.work_id) {\n return (\n <div style={styles.container}>\n <div style={styles.row}>\n <span style={styles.label}>ACN Work</span>\n <span style={styles.mono}>{data.work_id ?? \"\u2014\"}</span>\n </div>\n <div style={styles.row}>\n <span style={styles.label}>ACN Org</span>\n <span style={styles.mono}>{data.org_id ?? \"\u2014\"}</span>\n </div>\n {data.status ? (\n <div style={styles.row}>\n <span style={styles.label}>Status</span>\n <StatusBadge status={data.status} />\n </div>\n ) : (\n <div style={{ ...styles.muted, marginTop: \"8px\" }}>\n Linked via Org Harness. Moving this issue to done/cancelled PATCHes Org work\n status when autoApproveOnDone is enabled (done) or always (cancelled).\n </div>\n )}\n </div>\n );\n }\n\n if (!data.task_id) {\n return (\n <div style={styles.container}>\n <span style={styles.muted}>This issue is not linked to an ACN task.</span>\n </div>\n );\n }\n\n const submittedParticipation = data.participations.find(\n (p) => p.status === \"submitted\",\n );\n const canReview = !reviewDone && Boolean(submittedParticipation);\n\n return (\n <div style={styles.container}>\n {/* Task meta */}\n <div style={styles.row}>\n <span style={styles.label}>ACN Task</span>\n <span style={styles.mono}>{data.task_id}</span>\n </div>\n <div style={styles.row}>\n <span style={styles.label}>Status</span>\n <StatusBadge status={data.status} />\n </div>\n {parseFloat(data.reward ?? \"0\") > 0 && (\n <div style={styles.row}>\n <span style={styles.label}>Reward</span>\n <span>{data.reward} {data.reward_currency}</span>\n </div>\n )}\n\n {/* Participations */}\n {data.participations.length > 0 && (\n <div style={styles.section}>\n <div style={styles.sectionTitle}>\n Participants ({data.participations.length})\n </div>\n {data.participations.map((p) => (\n <ParticipationItem key={p.participation_id} p={p} />\n ))}\n </div>\n )}\n\n {/* Review panel \u2014 shown when there is a pending submission */}\n {canReview && (\n <ReviewPanel\n taskId={data.task_id}\n onDone={() => {\n setReviewDone(true);\n setTimeout(() => setReviewDone(false), 3000);\n }}\n />\n )}\n\n {reviewDone && (\n <div style={{ ...styles.section, color: \"#16a34a\", fontWeight: 600 }}>\n Review submitted. ACN will process the result.\n </div>\n )}\n </div>\n );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/worker.d.ts CHANGED
@@ -2,26 +2,88 @@
2
2
  * ACN Plugin Worker
3
3
  *
4
4
  * Responsibilities:
5
- * P0-1 Startup : register webhook URL as ACN subnet harness
6
- * P0-2 Startup : full sync — pull open ACN tasks → Paperclip issues
7
- * P0-3 ACN→PC : task.* webhook events → sync Paperclip issue status / comments
8
- * P0-4 PC→ACN : Paperclip issue done/cancelled → ACN review (approve / reject)
9
- * P0-5 PC→ACN : Paperclip issue created (not from ACN) ACN task
5
+ * P0-1 Startup : resolve/create ACN Org; register subnet harness webhook
6
+ * P0-2 Startup : full sync — pull open ACN tasks → Paperclip issues (legacy)
7
+ * P0-3 ACN→PC : task.* webhook events → sync Paperclip issue status / comments (legacy)
8
+ * P0-4 PC→ACN : Paperclip issue done/cancelled → ACN task review (legacy)
9
+ * P2c-C1 PC→ACN : Paperclip issue created Org work (NOT Task Pool)
10
+ * P2c-C2 ACN→PC : org.work_* / org.loop_tick → Issues (preferred inbound)
11
+ * P2c-C3 PC→ACN : Paperclip issue done/cancelled → PATCH Org work status
10
12
  */
11
13
  import type { PluginContext, PluginEvent } from "@paperclipai/plugin-sdk";
12
14
  import { ACNClient } from "acn-client";
13
- interface PluginConfig {
15
+ import { AcnOrgApi } from "./lib/org-api.js";
16
+ export interface PluginConfig {
14
17
  acnBaseUrl?: string;
15
18
  paperclipBaseUrl?: string;
16
19
  acnApiKeyRef?: string;
17
20
  /** Secret ref for the HMAC-SHA256 secret shared with ACN's harness webhook. */
18
21
  acnHarnessSecretRef?: string;
22
+ /** Org Harness org_id; auto-created + persisted when empty. */
23
+ acnOrgId?: string;
19
24
  acnSubnetId?: string;
20
25
  autoCreateIssues?: boolean;
21
26
  autoApproveOnDone?: boolean;
22
27
  }
23
- export declare function handleIssueUpdated(ctx: PluginContext, cfg: PluginConfig, client: ACNClient, event: PluginEvent): Promise<void>;
24
- export declare function handleIssueCreated(ctx: PluginContext, cfg: PluginConfig, client: ACNClient, event: PluginEvent): Promise<void>;
28
+ /**
29
+ * Envelope sent by ACN's WebhookService (WebhookPayload model).
30
+ *
31
+ * For Org Harness events, `task_id` is overloaded to carry `org_id` — always
32
+ * read work/org fields from `data`, never treat `task_id` as a Task Pool id
33
+ * when `event` starts with `org.`.
34
+ */
35
+ interface AcnHarnessEventPayload {
36
+ event: string;
37
+ timestamp?: string;
38
+ /** Task Pool task id, or org_id for org.* events (legacy field name). */
39
+ task_id?: string;
40
+ data: {
41
+ status?: string;
42
+ creator_id?: string;
43
+ assignee_id?: string;
44
+ reward?: string;
45
+ reward_currency?: string;
46
+ subnet_id?: string;
47
+ max_participants?: number;
48
+ participation_id?: string;
49
+ participant_id?: string;
50
+ participant_name?: string;
51
+ participation_status?: string;
52
+ resubmit_count?: number;
53
+ max_resubmit_attempts?: number;
54
+ rejection_reason?: string;
55
+ org_id?: string;
56
+ work_id?: string;
57
+ title?: string;
58
+ assignee_agent_id?: string | null;
59
+ open_count?: number;
60
+ work_ids?: string[];
61
+ assignees?: string[];
62
+ };
63
+ }
64
+ /** Mark a work_id as outbound so late/retry org.work_created skips create. */
65
+ export declare function noteRecentOutboundWork(workId: string): void;
66
+ /** Drop a work_id from the echo set (e.g. after saveMap failure). */
67
+ export declare function forgetRecentOutboundWork(workId: string): void;
68
+ /** Register an in-flight outbound create before awaiting createWork. */
69
+ export declare function beginOutboundWorkCreate(companyId: string, issueId: string, title: string): void;
70
+ /** Clear in-flight entry after createWork settles (success or failure). */
71
+ export declare function endOutboundWorkCreate(companyId: string, issueId: string): void;
72
+ /** Test helper — clear outbound echo + in-flight stacks. */
73
+ export declare function clearRecentOutboundWorkForTests(): void;
74
+ /**
75
+ * Resolve configured / persisted Org, or create one bound to ``acnSubnetId``.
76
+ * Mutates ``cfg.acnOrgId`` / ``cfg.acnSubnetId`` when filled from Org record.
77
+ *
78
+ * On ``subnet_already_bound`` (409): if the error body hints a ``org_…`` id,
79
+ * reuse it; otherwise fail with an operator-facing message to set ``acnOrgId``.
80
+ */
81
+ export declare function resolveAcnOrg(ctx: PluginContext, cfg: PluginConfig, orgApi: AcnOrgApi, companyId: string | undefined, companyName: string | undefined): Promise<string>;
82
+ export declare function handleOrgWorkCreated(ctx: PluginContext, cfg: PluginConfig, companyId: string, data: AcnHarnessEventPayload["data"]): Promise<void>;
83
+ export declare function handleOrgWorkUpdated(ctx: PluginContext, cfg: PluginConfig, companyId: string, data: AcnHarnessEventPayload["data"]): Promise<void>;
84
+ export declare function handleOrgLoopTick(ctx: PluginContext, cfg: PluginConfig, companyId: string, data: AcnHarnessEventPayload["data"]): Promise<void>;
85
+ export declare function handleIssueUpdated(ctx: PluginContext, cfg: PluginConfig, client: ACNClient, orgApi: AcnOrgApi, event: PluginEvent): Promise<void>;
86
+ export declare function handleIssueCreated(ctx: PluginContext, cfg: PluginConfig, orgApi: AcnOrgApi, event: PluginEvent): Promise<void>;
25
87
  declare const plugin: import("@paperclipai/plugin-sdk").PaperclipPlugin;
26
88
  export default plugin;
27
89
  //# sourceMappingURL=worker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE1E,OAAO,EAAE,SAAS,EAAa,MAAM,YAAY,CAAC;AAQlD,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AA8SD,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CA2Cf;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,aAAa,EAClB,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CAwDf;AAID,QAAA,MAAM,MAAM,mDAuJV,CAAC;AAIH,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}